构建生成1-9间插+/-或无符号的所有合法表达式的函数问题
解决1-9数字插入符号生成和为100的表达式问题(附代码排查)
嘿,我来帮你搞定这个问题!你遇到的核心问题十有八九是没覆盖完整三个操作选项(+、-、无符号拼接),或者在处理“无符号”的逻辑时出错了——很多人一开始会把“无符号”当成空操作,但实际上它是把相邻数字合并成一个数,这和单纯插入+/-的逻辑完全不同。
常见错误排查
- 你的代码片段里
$characters = ['+', '-', ...,如果后面没加代表“拼接”的标识(比如空字符串''),那直接就漏了三分之一的组合,肯定生成不全。 - 如果加了空字符串,但只是简单地把符号插入数字之间(比如变成
1''2),没有把相邻数字合并成12,那生成的表达式是无效的,自然也找不到正确结果。
正确实现思路
- 1-9共有8个数字间隔(1&2、2&3...8&9),每个间隔有3种选择:
+、-、拼接(无符号) - 生成所有8个间隔的组合(总共有3^8=6561种,数量不大,完全可以遍历)
- 把每个组合转换成合法的数学表达式,计算结果
- 筛选出结果等于100的表达式
PHP代码实现(完整可运行)
function findExpressionsThatSumTo100() { $digits = ['1','2','3','4','5','6','7','8','9']; $operators = ['+', '-', '']; // 空字符串代表拼接 $result = []; // 递归生成所有组合并计算 $generate = function($index, $currentExpr, $currentVal, $total) use ($digits, $operators, &$result, &$generate) { if ($index === count($digits)) { if ($total + $currentVal === 100) { $result[] = $currentExpr . ' = 100'; } return; } $digit = $digits[$index]; // 1. 拼接:把当前数字加到currentVal的末尾 $newCurrentVal = $currentVal * 10 + (int)$digit; $generate($index + 1, $currentExpr . $digit, $newCurrentVal, $total); // 2. 加:把currentVal加到total,currentVal重置为当前数字 $generate($index + 1, $currentExpr . '+' . $digit, (int)$digit, $total + $currentVal); // 3. 减:把currentVal加到total,currentVal重置为当前数字的负数 $generate($index + 1, $currentExpr . '-' . $digit, -(int)$digit, $total + $currentVal); }; // 从第一个数字开始初始化 $generate(1, $digits[0], (int)$digits[0], 0); return $result; } // 调用并输出结果 $expressions = findExpressionsThatSumTo100(); foreach ($expressions as $expr) { echo $expr . "\n"; }
代码解释
- 用递归的方式逐个处理数字,避免生成所有字符串再解析(更高效)
- 维护三个关键变量:
currentExpr当前表达式字符串,currentVal当前正在拼接的数字(比如拼接1和2时,currentVal从1变成12),total已经累计的结果 - 三种分支分别处理拼接、加、减操作,确保所有组合都被覆盖
- 最后当处理完所有9个数字时,检查
total + currentVal是否等于100,符合条件就加入结果集
运行结果示例
你会得到所有符合条件的表达式,比如:
123-45-67+89 = 100
1+23-4+5+6+78-9 = 100
1+2+34-5+67-8+9 = 100
...(总共12种正确结果)
内容的提问来源于stack exchange,提问作者Code Prank
相关产品推荐
相关产品推荐

