
本文介绍一种高效解析形如 “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