返回
初探 JS 大数相加:步步解析,稳扎稳打
前端
2023-12-29 19:16:50
在 JavaScript 的面试题中,一道常见的问题是实现大数相加。乍一看,似乎很简单,不就是把两个字符串数字相加吗?但细究起来,其实隐藏着许多细节和算法的巧思。
安全范围与字符串的巧妙运用
首先,我们要了解 JavaScript 中非负整数的安全范围。它在-9007199254740991到9007199254740991之间。超出这个范围,就会发生精度丢失。
因此,在实现大数相加时,我们需要把数字表示成字符串。这样就不会丢失精度,而且字符串的加法运算更加方便。
步步拆解,稳扎稳打
接下来,我们一步一步地来实现大数相加算法:
-
反转字符串。 为了方便相加,我们需要先把两个字符串反转过来。这样,个位数就在最前面,十位数在后面,依次类推。
-
逐位相加。 从最前面的个位数开始,逐位相加。如果相加的结果大于等于10,那么需要进位,并在下一位上加上1。
-
处理进位。 进位是一个需要注意的地方。如果在相加过程中出现进位,那么需要在下一位上加上1。
-
处理末尾的进位。 当所有位数都相加完成后,还需要处理末尾的进位。如果末尾有进位,那么需要在最后一位上加上1。
-
反转字符串,得到最终结果。 最后,把反转后的字符串再反转一次,就可以得到最终的相加结果。
代码实现
有了上述步骤,我们就可以用代码来实现大数相加算法了:
function bigSum(num1, num2) {
// 反转字符串
num1 = num1.split('').reverse().join('');
num2 = num2.split('').reverse().join('');
// 逐位相加
let sum = '';
let carry = 0;
for (let i = 0; i < Math.max(num1.length, num2.length); i++) {
let digit1 = parseInt(num1[i] || '0');
let digit2 = parseInt(num2[i] || '0');
let total = digit1 + digit2 + carry;
carry = Math.floor(total / 10);
sum += total % 10;
}
// 处理末尾的进位
if (carry > 0) {
sum += carry;
}
// 反转字符串,得到最终结果
return sum.split('').reverse().join('');
}
示例
console.log(bigSum('123456789', '987654321')); // "1111111110"
console.log(bigSum('99999999999999999999999999999999999999999999999999999999999999999999', '1')); // "1000000000000000000000000000000000000000000000000000000000000000000000"
总结
通过这篇文章,我们详细剖析了 JS 大数相加算法的实现步骤和代码细节。希望对您理解该算法有所帮助。在面试中,如果您能熟练地讲解该算法并给出清晰的代码实现,那么一定会给面试官留下深刻的印象。