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

需求:基于Haskell/Python实现车牌数字凑零游戏程序

实现车牌凑零游戏(Python版)

嘿,这个童年游戏挺有意思的!先澄清一个小细节:4个数字只能搭配3个运算符,所以没法严格做到“加减乘除四种运算各用一次”(需要4个运算符对应5个数字)。我推测你是指**使用加减乘除中的任意几种(每种最多用一次)**来组合表达式,结果为0——毕竟你的例子也是基于4个数字+3种运算符的逻辑,下面就按这个需求来实现。

核心思路

要解决这个问题,我们需要遍历所有可能的组合:

  • 数字的全排列:车牌上的数字顺序可以任意调整
  • 运算符的组合:从+、-、*、/中选3个不同的运算符(每种最多用一次)
  • 运算优先级的变化:通过括号改变运算顺序,覆盖所有可能的计算逻辑
  • 筛选结果为0的表达式,去重后输出

Python代码实现

import itertools

def evaluate_expression(numbers, ops):
    """计算所有可能的括号组合下的表达式结果和对应的表达式字符串"""
    a, b, c, d = numbers
    op1, op2, op3 = ops
    expressions = []
    
    # 结构1: ((a op1 b) op2 c) op3 d
    try:
        val1 = eval(f"(({a}{op1}{b}){op2}{c}){op3}{d}")
        expr1 = f"(({a}{op1}{b}){op2}{c}){op3}{d}"
        if val1 == 0:
            expressions.append(expr1)
    except ZeroDivisionError:
        pass
    
    # 结构2: (a op1 (b op2 c)) op3 d
    try:
        val2 = eval(f"({a}{op1}({b}{op2}{c})){op3}{d}")
        expr2 = f"({a}{op1}({b}{op2}{c})){op3}{d}"
        if val2 == 0:
            expressions.append(expr2)
    except ZeroDivisionError:
        pass
    
    # 结构3: a op1 ((b op2 c) op3 d)
    try:
        val3 = eval(f"{a}{op1}(({b}{op2}{c}){op3}{d})")
        expr3 = f"{a}{op1}(({b}{op2}{c}){op3}{d})"
        if val3 == 0:
            expressions.append(expr3)
    except ZeroDivisionError:
        pass
    
    # 结构4: a op1 (b op2 (c op3 d))
    try:
        val4 = eval(f"{a}{op1}({b}{op2}({c}{op3}{d}))")
        expr4 = f"{a}{op1}({b}{op2}({c}{op3}{d}))"
        if val4 == 0:
            expressions.append(expr4)
    except ZeroDivisionError:
        pass
    
    # 结构5: (a op1 b) op2 (c op3 d)
    try:
        val5 = eval(f"({a}{op1}{b}){op2}({c}{op3}{d})")
        expr5 = f"({a}{op1}{b}){op2}({c}{op3}{d})"
        if val5 == 0:
            expressions.append(expr5)
    except ZeroDivisionError:
        pass
    
    return expressions

def find_zero_expressions(plate_numbers):
    """输入车牌数字列表(比如[2,5,9,1]),返回所有符合条件的表达式"""
    valid_expressions = set()  # 用集合去重
    
    # 遍历所有数字排列
    for num_perm in itertools.permutations(plate_numbers):
        # 遍历所有3个不同运算符的组合
        for op_comb in itertools.permutations(['+', '-', '*', '/'], 3):
            exprs = evaluate_expression(num_perm, op_comb)
            for expr in exprs:
                # 用÷替换/,让表达式更直观
                simplified_expr = expr.replace('/','÷')
                valid_expressions.add(simplified_expr)
    
    # 转换为列表并排序,方便阅读
    return sorted(valid_expressions)

# 测试例子
if __name__ == "__main__":
    # 测试第一个例子:2591
    print("车牌数字2591的凑零表达式:")
    results1 = find_zero_expressions([2,5,9,1])
    for idx, expr in enumerate(results1, 1):
        print(f"{idx}. {expr} = 0")
    
    print("\n" + "-"*50 + "\n")
    
    # 测试第二个例子:2491
    print("车牌数字2491的凑零表达式:")
    results2 = find_zero_expressions([2,4,9,1])
    for idx, expr in enumerate(results2, 1):
        print(f"{idx}. {expr} = 0")

代码说明

  1. evaluate_expression函数:负责计算5种常见括号结构下的表达式结果,同时捕获除法除零的异常,避免程序崩溃。
  2. find_zero_expressions函数:
    • 用itertools.permutations生成所有数字的排列(比如[2,5,9,1]的所有可能顺序)
    • 生成所有3个不同运算符的组合(从加减乘除中选3个)
    • 收集所有结果为0的表达式,用集合去重(避免不同排列生成相同表达式)
  3. 测试部分:直接代入你给出的两个例子,输出所有符合条件的凑零表达式。

运行效果

比如输入[2,5,9,1],会输出包括((2*5)-(9+1))在内的所有有效表达式;输入[2,4,9,1]会输出((2*4)+1)-9等结果。

如果需要支持5个数字(严格使用四种运算各一次),只需要修改代码中的数字排列长度和运算符组合长度,以及扩展表达式结构即可,逻辑是相通的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:18:02