题解 | #高精度整数加法#

高精度整数加法

https://www.nowcoder.com/practice/49e772ab08994a96980f9618892e55b6

  1. 把字符串split成数组。
  2. reverse翻转数组,让最小位在前,便于计算。
  3. 初始化一个空数组r,每个元素都是0,同时数组长度要比 两个字符串数组中最长的还要加1,即Math.max(length1,length2)+1,加1是为了进位,比如999 + 99 ,最长999 为3 位,但最终结果是 1098, 4位
  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]
  5. 所有位全部遍历完成后,先判断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(''));
})();

全部评论

相关推荐

冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务