需求:基于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")
代码说明
evaluate_expression函数:负责计算5种常见括号结构下的表达式结果,同时捕获除法除零的异常,避免程序崩溃。find_zero_expressions函数:- 用
itertools.permutations生成所有数字的排列(比如[2,5,9,1]的所有可能顺序) - 生成所有3个不同运算符的组合(从加减乘除中选3个)
- 收集所有结果为0的表达式,用集合去重(避免不同排列生成相同表达式)
- 用
- 测试部分:直接代入你给出的两个例子,输出所有符合条件的凑零表达式。
运行效果
比如输入[2,5,9,1],会输出包括((2*5)-(9+1))在内的所有有效表达式;输入[2,4,9,1]会输出((2*4)+1)-9等结果。
如果需要支持5个数字(严格使用四种运算各一次),只需要修改代码中的数字排列长度和运算符组合长度,以及扩展表达式结构即可,逻辑是相通的。
内容的提问来源于stack exchange,提问作者user9183739
相关产品推荐
相关产品推荐

