基于Python实现1-9数字含2加2减运算符的目标数组合求解脚本需求
问题分析与实现思路
先明确核心约束:数字1-9必须按顺序排列,8个数字间隙里必须插入2个+、2个-,剩下的间隙不插符号(数字直接拼接),最终要找出所有运算结果等于目标数的表达式。
实现分四步走:
- 生成合法符号位置组合:从8个间隙里选2个放+,再从剩下的6个里选2个放——用
itertools.combinations能高效生成所有不重复的位置组合,避免手动枚举的冗余。 - 拼接表达式字符串:按数字顺序遍历,遇到标记了符号的间隙就插入对应符号,没标记的就继续拼接数字,最终得到完整的算术表达式。
- 计算表达式结果:直接用
eval计算表达式值(这里都是自己生成的合法表达式,不存在安全问题)。 - 筛选匹配目标的表达式:把计算结果等于目标数的表达式收集起来,就是最终结果。
Python 实现脚本
import itertools def find_target_expressions(target): digits = list('123456789') gaps = list(range(8)) # 数字间的8个间隙,索引0对应1和2之间,以此类推 valid_exprs = [] # 生成所有合法的符号位置组合:先选2个间隙放+,再从剩余间隙选2个放- for plus_pos in itertools.combinations(gaps, 2): remaining_gaps = [g for g in gaps if g not in plus_pos] for minus_pos in itertools.combinations(remaining_gaps, 2): # 构建间隙到符号的映射 symbol_map = {} for p in plus_pos: symbol_map[p] = '+' for m in minus_pos: symbol_map[m] = '-' # 拼接表达式 expr = [] for idx in range(9): expr.append(digits[idx]) # 处理当前数字后的间隙(如果不是最后一个数字) if idx < 8: if idx in symbol_map: expr.append(symbol_map[idx]) expr_str = ''.join(expr) # 计算结果并匹配目标 try: if eval(expr_str) == target: valid_exprs.append(expr_str) except: # 理论上不会触发,因为表达式都是合法的 pass return valid_exprs # 示例:查找结果为50的表达式 if __name__ == '__main__': target_num = 50 results = find_target_expressions(target_num) if results: print(f"找到以下等于{target_num}的表达式:") for expr in results: print(expr) else: print(f"未找到等于{target_num}的表达式")
内容的提问来源于stack exchange,提问作者Cameron Ashton
相关产品推荐
相关产品推荐

