You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python求解任意n个未知量的整数方程x₁+…+xₙ=0

解决任意n和S下的整数解查找问题

要在Python中实现任意n和S下,找出所有满足以下条件的整数组合$(x_1,x_2,...,x_n)$:

  • 每个$x_i$的取值范围是$-S \leq x_i \leq S$
  • $x_1 + x_2 + ... + x_n = 0$

可以借助itertools模块生成所有可能的数值组合,再通过约束条件筛选,以下是两种实用方案:

基础实现(直接生成所有组合)

利用itertools.product生成n个元素的笛卡尔积(即所有可能的数值组合),再过滤出和为0的组合:

import itertools

def find_solutions(n, S):
    # 生成所有n个元素的组合,每个元素取值范围是[-S, S]
    all_combinations = itertools.product(range(-S, S + 1), repeat=n)
    # 筛选和为0的组合并转为列表格式
    solutions = [list(comb) for comb in all_combinations if sum(comb) == 0]
    return solutions

说明

  • itertools.product(range(-S, S+1), repeat=n)会生成所有由n个[-S,S]整数组成的元组,完全替代了手动写多层嵌套循环的冗余代码
  • 当你传入n=9, S=1时,该函数会返回和你提供的示例完全一致的结果

优化实现(减少不必要的计算)

当n或S较大时,基础方法会生成大量无效组合,效率偏低。可以通过提前计算最后一个元素的必要值来减少计算量:

import itertools

def find_solutions_optimized(n, S):
    solutions = []
    # 先生成前n-1个元素的所有组合
    for prefix in itertools.product(range(-S, S + 1), repeat=n-1):
        required_last = -sum(prefix)
        # 检查最后一个元素是否在合法范围内
        if -S <= required_last <= S:
            solutions.append(list(prefix) + [required_last])
    return solutions

说明

  • 由于前n-1个元素的和确定后,最后一个元素必须等于它们的相反数才能满足总和为0,因此只需验证这个相反数是否在[-S,S]范围内即可
  • 该方法的计算量仅为基础方法的$1/(2S+1)$,n越大、S越大,效率提升越明显

内容的提问来源于stack exchange,提问作者DarkBulle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:15:29