题解 | #高精度整数加法#
高精度整数加法
https://www.nowcoder.com/practice/49e772ab08994a96980f9618892e55b6
- 把字符串split成数组。
- reverse翻转数组,让最小位在前,便于计算。
- 初始化一个空数组r,每个元素都是0,同时数组长度要比 两个字符串数组中最长的还要加1,即Math.max(length1,length2)+1,加1是为了进位,比如999 + 99 ,最长999 为3 位,但最终结果是 1098, 4位
- 遍历,逐个计算:r[i]+a[0][i] + a[1][i] ,如果大于等于10,则 当前位 r[i] = r[i]+a[0][i] + a[1][i]-10, 同时下一位进1:r[i] = 1; 如果小于10,则不需要进位,r[i] = r[i]+a[0][i] + a[1][i]
- 所有位全部遍历完成后,先判断r的最后一位是不是0:
如果是0,则说明最后没有产生进位,比如:345 + 11 = 356 ,仍然是3位,则此时,需要把r最末尾的0删掉;
如果不是0,则说明产生了进位,比如999 + 99 = 1098,此时r多加的一位产生了作用,被占了,则不需要额外处理。
6. 最后,reverse翻转数组,使其变回原来正常顺序,再变成字符串join
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; void (async function () { // Write your code here let arr = []; while ((line = await readline())) { arr.push(line.split("").map(Number).reverse()); // 变成数字、翻转数组 } let bigL = arr[0].length >= arr[1].length ? arr[0].length : arr[1].length; // 取最大数的长度 let res = new Array(bigL + 1).fill(0); // 初始化res数组,多初始化一位,因为最后可能多进一位 for (let i = 0; i < bigL; i++) { let tc = 0; if (arr[0][i] != undefined && arr[1][i] != undefined) { tc = res[i] + arr[0][i] + arr[1][i]; } else if (arr[0][i] == undefined && arr[1][i] != undefined) { tc = res[i] + arr[1][i]; }else if(arr[0][i] != undefined && arr[1][i] == undefined){ tc = res[i] + arr[0][i]; } if (tc >= 10) { tc = tc - 10; res[i+1] = 1; // 进位 } res[i] = tc; } if(res[bigL] == 0){ // 如果最后没有进一位,记得把末尾的0删掉 res.splice(bigL,1); } console.log(res.reverse().join('')); })();