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

如何实现列表元素排列与运算符组合计算出指定结果42?

解决思路与代码实现

首先,我注意到你在生成运算符组合的时候犯了一个小错误:5个数字之间只需要4个运算符,但你用了combinations_with_replacement(["+","-","*"], 5),这会生成5个运算符的组合,没法和5个数字正确配对。我们先修正这个问题,再把数字排列和运算符组合结合起来计算结果。

核心步骤分解

  1. 生成所有数字排列:用permutations生成列表中5个元素的全排列,总共有5! = 120种不同的数字顺序。
  2. 生成正确的运算符组合:用combinations_with_replacement生成4个运算符的可重复组合,这样才能和5个数字一一交替拼接成合法表达式。
  3. 拼接表达式并计算结果:将每个数字排列和运算符组合拼接成字符串表达式,用eval()计算其值(自动处理*的优先级),判断是否等于目标值42。

完整代码实现

from itertools import permutations, combinations_with_replacement

target = 42
numbers = [40, 1, 3, 4, 20]

# 生成所有数字的全排列
number_permutations = permutations(numbers)

# 生成4个运算符的可重复组合(5个数字需要4个运算符)
operator_combinations = combinations_with_replacement(["+", "-", "*"], 4)

# 标记是否找到符合条件的表达式
found_solution = False

# 遍历所有数字排列和运算符组合
for nums in number_permutations:
    for ops in operator_combinations:
        # 拼接表达式:数字与运算符交替排列
        expression = ""
        for idx in range(len(nums)):
            expression += str(nums[idx])
            # 最后一个数字后不需要加运算符
            if idx < len(ops):
                expression += ops[idx]
        
        # 计算表达式结果
        try:
            result = eval(expression)
            if result == target:
                print(f"找到符合条件的表达式:{expression} = {target}")
                found_solution = True
                # 如果只需要找到第一个解,可在此处添加 break 跳出循环
                # break
        except Exception as e:
            # 本问题中无除法,不会出现除零错误,此处仅为通用容错
            continue

if not found_solution:
    print(f"未找到能得到{target}的表达式组合")

代码说明

  • 运算符数量修正:将combinations_with_replacement的第二个参数改为4,确保运算符数量和数字间隔匹配。
  • 表达式拼接:通过循环将数字和运算符交替拼接成合法的数学表达式字符串,比如"20*4-40+3-1"。
  • 结果计算:使用eval()可以自动处理运算优先级(先乘后加减),无需手动实现优先级逻辑,对于本问题这种可控输入场景非常高效。
  • 可选优化:如果只需要找到任意一个符合条件的解,可以在找到后立即break终止循环,节省计算资源。

运行这段代码后,会输出你示例中的表达式,以及其他可能符合条件的组合(如果有的话)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:34:07