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

构建生成1-9间插+/-或无符号的所有合法表达式的函数问题

解决1-9数字插入符号生成和为100的表达式问题(附代码排查)

嘿,我来帮你搞定这个问题!你遇到的核心问题十有八九是没覆盖完整三个操作选项(+、-、无符号拼接),或者在处理“无符号”的逻辑时出错了——很多人一开始会把“无符号”当成空操作,但实际上它是把相邻数字合并成一个数,这和单纯插入+/-的逻辑完全不同。

常见错误排查

  • 你的代码片段里$characters = ['+', '-', ...,如果后面没加代表“拼接”的标识(比如空字符串''),那直接就漏了三分之一的组合,肯定生成不全。
  • 如果加了空字符串,但只是简单地把符号插入数字之间(比如变成1''2),没有把相邻数字合并成12,那生成的表达式是无效的,自然也找不到正确结果。

正确实现思路

  1. 1-9共有8个数字间隔(1&2、2&3...8&9),每个间隔有3种选择:+、-、拼接(无符号)
  2. 生成所有8个间隔的组合(总共有3^8=6561种,数量不大,完全可以遍历)
  3. 把每个组合转换成合法的数学表达式,计算结果
  4. 筛选出结果等于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:22:48