
⚠️重点是怎么处理carry
js
/**
* 字符串形式的非负整数相加(模拟大数加法,避免数值溢出)
* @param {string} num1 - 第一个数字字符串(仅包含 0-9 的字符)
* @param {string} num2 - 第二个数字字符串(仅包含 0-9 的字符)
* @return {string} 两个数字相加后的结果字符串
*/
var addStrings = function (num1, num2) {
// 初始化结果字符串
let res = ''
// 定义三个变量:
// i: 指向 num1 最后一个字符的指针(从末尾开始遍历)
// j: 指向 num2 最后一个字符的指针
// carry: 进位值(初始为 0,例如 9+9=18,进位为 1)
let i = num1.length - 1,
j = num2.length - 1,
carry = 0
// 循环条件:只要 num1 或 num2 还有未处理的字符,或还有进位,就继续计算
// (i >= 0 处理 num1 剩余字符,j >= 0 处理 num2 剩余字符)
while (i >= 0 || j >= 0) {
// 取出 num1 当前位的数字:如果 i >= 0 则取对应字符转数字,否则补 0
const n1 = i >= 0 ? parseInt(num1[i]) : 0
// 取出 num2 当前位的数字:逻辑同 n1
const n2 = j >= 0 ? parseInt(num2[j]) : 0
// 计算当前位的总和:n1 + n2 + 上一轮的进位
const tmp = n1 + n2 + carry
// 更新进位:总和除以 10 取整(例如 18//10=1,9//10=0)
carry = Math.floor(tmp / 10)
// 计算当前位的结果:总和对 10 取余(例如 18%10=8,9%10=9)
// 注意:要把当前位结果拼在 res 前面(因为是从后往前计算)
res = (tmp % 10) + res
// 指针向前移动一位,处理前一位的数字
i--
j--
}
// 循环结束后,如果还有进位(例如 999 + 1 = 1000),需要在结果前补 1
// 否则直接返回结果字符串
return carry ? '1' + res : res
}