
本文讲解如何将用户输入的二进制数先转换为十进制,再将该十进制数的每一位数字单独提取、平方后求和(例如 38 → 3² + 8² = 73)。
本文讲解如何将用户输入的二进制数先转换为十进制,再将该十进制数的每一位数字单独提取、平方后求和(例如 38 → 3² + 8² = 73)。
在 JavaScript 中,对一个整数的各位数字分别求平方并累加,关键在于将数字拆解为单个数字字符,再逐个转换为数值并计算平方。原始代码中 squareIt 函数存在两个核心问题:
- Math.pow(sNumber, 2) 错误地对整个字符串(如 "38")求平方,而非对单个数字(3 和 8)分别操作;
- 循环逻辑冗余,且未正确访问每一位数字。
✅ 正确做法是:
- 使用 .toString() 将数字转为字符串(如 38 → "38");
- 用 .split('') 拆分为字符数组(["3", "8"]);
- 利用 Array.prototype.reduce() 累加每位数字的平方值,初始值设为 0;
- 在回调中,c * c 会自动将字符转为数字并平方(JavaScript 的隐式类型转换保障了这一点)。
以下是优化后的完整可运行代码:
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.charAt(i)) * Math.pow(2, power);
power++;
}
console.log("Decimal : " + decimal);
console.log("Sum of squares of digits: " + squareIt(decimal));
}
function squareIt(decimal) {
return decimal.toString()
.split('')
.reduce((sum, digitChar) => sum + digitChar * digitChar, 0);
}
binaryToDecimalConverter(binary);
? 注意事项:
- 输入校验未包含在本例中,实际项目中应验证 binary 是否为合法二进制字符串(仅含 '0' 和 '1');
- digitChar * digitChar 是安全的,因为乘法运算会自动调用 Number(digitChar);若需显式转换,也可写为 parseInt(digitChar, 10) ** 2;
- reduce 方案简洁、函数式、无副作用,优于手动 for 循环,推荐作为标准实践。
该方法不仅适用于二进制转十进制后的处理,也通用适用于任意正整数的“各位平方和”计算场景(如数学中的快乐数判断)。










