返回

初探 JS 大数相加:步步解析,稳扎稳打

前端

在 JavaScript 的面试题中,一道常见的问题是实现大数相加。乍一看,似乎很简单,不就是把两个字符串数字相加吗?但细究起来,其实隐藏着许多细节和算法的巧思。

安全范围与字符串的巧妙运用

首先,我们要了解 JavaScript 中非负整数的安全范围。它在-9007199254740991到9007199254740991之间。超出这个范围,就会发生精度丢失。

因此,在实现大数相加时,我们需要把数字表示成字符串。这样就不会丢失精度,而且字符串的加法运算更加方便。

步步拆解,稳扎稳打

接下来,我们一步一步地来实现大数相加算法:

  1. 反转字符串。 为了方便相加,我们需要先把两个字符串反转过来。这样,个位数就在最前面,十位数在后面,依次类推。

  2. 逐位相加。 从最前面的个位数开始,逐位相加。如果相加的结果大于等于10,那么需要进位,并在下一位上加上1。

  3. 处理进位。 进位是一个需要注意的地方。如果在相加过程中出现进位,那么需要在下一位上加上1。

  4. 处理末尾的进位。 当所有位数都相加完成后,还需要处理末尾的进位。如果末尾有进位,那么需要在最后一位上加上1。

  5. 反转字符串,得到最终结果。 最后,把反转后的字符串再反转一次,就可以得到最终的相加结果。

代码实现

有了上述步骤,我们就可以用代码来实现大数相加算法了:

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 大数相加算法的实现步骤和代码细节。希望对您理解该算法有所帮助。在面试中,如果您能熟练地讲解该算法并给出清晰的代码实现,那么一定会给面试官留下深刻的印象。