如何用 PHP 解析含未知数 x 的简单算式并求解缺失数字

如何用 PHP 解析含未知数 x 的简单算式并求解缺失数字

本文介绍一种高效解析形如 “3x + 12 = 46” 的单变量算式的方法,通过字符串拆分、运算符识别与逆运算逻辑,精准定位并返回替换 ‘x’ 后使等式成立的唯一数字(0–9)。适用于教育类小工具或轻量级数学验证场景。

本文介绍一种高效解析形如 “3x + 12 = 46” 的单变量算式的方法,通过字符串拆分、运算符识别与逆运算逻辑,精准定位并返回替换 ‘x’ 后使等式成立的唯一数字(0–9)。适用于教育类小工具或轻量级数学验证场景。

在实际开发中,我们常需处理带占位符(如 x)的简易算式校验任务。本教程提供一个健壮、可扩展的 PHP 实现方案 —— MissingDigit($str) 函数,它能自动识别 x 所在位置(左操作数、右操作数或结果项),并基于四则运算的逆运算关系求解缺失数字。

核心思路

函数将输入字符串(如 “3x + 12 = 46″)按 = 拆分为左右两部分;再通过正则提取两个操作数及运算符;关键在于统一将含 x 的项移至等号左侧,其余项移至右侧,从而转化为标准形式:
x_part operator number = result → x_part = result inverse_operator number

例如:

  • “3x + 12 = 46” → 3x = 46 – 12 → 3x = 34 → x = 34 / 3 → 但注意:此处 x 是单个数字,因此 3x 表示十位为 3、个位为 x 的两位数(即 30 + x),而非乘法。这点需特别注意——题干中 “3x” 是字符串拼接含义,不是代数乘法。

⚠️ 重要澄清:原始答案代码存在严重逻辑缺陷——它错误地将 “3x” 视为 3 * x 并使用 eval() 计算,但题目明确说明 “3x + 12 = 46” 的解是 4(即 34 + 12 = 46),说明 x 是数字字符插入到整数字符串中的某一位,而非代数变量。因此正确解法应采用枚举+字符串替换+表达式求值策略:

立即学习“PHP免费学习笔记(深入)”;

function MissingDigit($str) {
    // 分离等式左右两侧
    list($left, $right) = array_map('trim', explode('=', $str));

    // 尝试 0~9 替换每个 'x',验证是否成立
    for ($x = 0; $x <= 9; $x++) {
        $testStr = str_replace('x', (string)$x, $str);
        // 安全计算:仅允许数字、空格、+-*/= 运算符
        if (preg_match('/^[\d\s\+\-\*\/\=]+$/', str_replace(' ', '', $testStr))) {
            // 使用 eval 前严格校验格式(生产环境建议用 tokenizer 或第三方 math parser)
            $safeExpr = str_replace('=', '==', $testStr);
            if (@eval("return $safeExpr;")) {
                return (string)$x;
            }
        }
    }
    return '-1'; // 未找到有效解
}

使用示例

echo MissingDigit("3x + 12 = 46");   // 输出: "4"
echo MissingDigit("1x0 / 5 = 22");   // 输出: "1" (即 110 / 5 = 22)
echo MissingDigit("5 - x = 2");      // 输出: "3"

注意事项

  • ✅ 输入保证有且仅有一个 x,且解唯一(0–9 整数);
  • ⚠️ eval() 存在安全风险,生产环境应改用 symfony/expression-language 或自定义简易解析器;
  • ? 若 x 出现在多位数中间(如 “1×2″),需确保字符串替换逻辑覆盖所有位置;
  • ? 运算符优先级由 PHP 默认规则处理,无需额外括号;除法结果为浮点数时需用 round() 或 intval() 对齐整数比较。

该方案兼顾简洁性与正确性,是教学场景与小型工具的理想实现。

文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/shoujipingce/127104.html

上一篇 2026-07-19 23:39
下一篇 2026-07-19 23:39

相关推荐