跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何对二进制转十进制后的数字各位分别求平方并累加

本文详解如何将用户输入的二进制字符串转换为十进制整数,并进一步计算该十进制数各位数字的平方和(如 38 → 3² + 8² = 9 + 64 = 73),重点纠正原始代码中 Math.pow(sNumber, 2) 的误用,提供简洁、健壮的实现方案。 本文详解如何将用户输入的二进制字符串转换为十进制整数,并进一步计算该十进制数**各位数字的平方和**(如 38 → 3² + 8² = 9 + 64 = 73),重点纠正原始代码中 `math.pow(snumber, 2)` 的误用,提供简洁、健壮的实现方案。 在 JavaScript 中,将二进制字符串转换为十进制数是常见需求,但后续若需对结果的 每一位数字单独处理 (例如求各位数字的平方和),关键在于正确地“拆解”数字——不能直接对整个字符串调用 Math.pow(),而应先转为字符串、再逐字符解析为数字。 原始代码中存在一个核心错误:
total += Number(sNumber.charAt(i)) * Math.pow(sNumber, 2); // ❌ 错误!sNumber 是字符串,Math.pow("38", 2) 会尝试将字符串转为数字后平方,导致计算的是 38²=1444,而非各位平方
这会导致逻辑完全偏离目标(本意是 3² + 8²,却算成了 38²)。 ✅ 正确做法是:将十进制结果转为字符串 → 拆分为字符数组 → 使用 reduce() 累加每个字符转为数字后的平方值。优化后的 squareIt 函数如下:
function squareIt(decimal) { return decimal.toString() .split('') // 转字符串后分割为 ['3', '8'] .reduce((sum, char) => sum + Number(char) ** 2, 0); // 每位转数、平方、累加 }
该写法简洁、函数式、无副作用。Number(char) ** 2 是 Math.pow(Number(char), 2) 的现代等价写法,更直观;初始值 0 确保空输入返回 0。 完整可运行示例:
let binary = prompt("Write a Binary Number"); function binaryToDecimalConverter(binary) { let decimal = 0; let power = 0; for (let i = binary.length - 1; i >= 0; i--) { decimal += Number(binary[i]) * (2 ** power); // 用 ** 替代 Math.pow 更简洁 power++; } console.log("Decimal: " + decimal); console.log("Sum of squares of digits:", squareIt(decimal)); } function squareIt(decimal) { return decimal.toString() .split('') .reduce((sum, digit) => sum + Number(digit) ** 2, 0); } binaryToDecimalConverter(binary);
⚠️ 注意事项: 输入校验未包含在示例中,实际项目中建议添加:检查 binary 是否为空、是否只含 '0' 和 '1'; prompt() 返回字符串,Number(binary[i]) 可安全处理 '0'/'1',但若用户输入非法字符(如 '2'),结果将为 NaN,建议增加 isNaN() 判断; 对于大数,toString() 仍可靠;若需支持科学计数法表示的数字(如 1e21),应先用 String(decimal) 并正则清洗,但本场景(二进制转换)通常不涉及。 总结:数字各位运算的本质是「字符串化 → 遍历 → 数字化 → 计算」。掌握 split('') 与 reduce() 的组合,能高效、可读地实现各类数位级处理逻辑。

相关文章