两个非负大整数相加

532 阅读1分钟

题目:两个非负大整数相加

解法1:在js中使用BigInt类型

解法2:

const numLength = 15;

function bigNumSum(bigNumA:string, bigNumB:string){
    let resultA:Array<string> = [];
    let resultB:Array<string> = [];
    let result:Array<string> = []
    let bigResult = bigNumA.length > bigNumB.length ? resultA :resultB;
    for (let index = bigNumA.length; index > 0; index-=numLength) {
        let start = index - numLength;
        start = start >=0 ? start : 0;
        resultA.push(bigNumA.substring(start, index));
    }
    for (let index = bigNumB.length; index > 0; index-=numLength) {
        let start = index - numLength;
        start = start >=0 ? start : 0;
        resultB.push(bigNumB.substring(start, index));
    }
    let bigLocation:string = '0';
    bigResult.forEach((_, index)=> {
        let a:number = resultA[index]? Number(resultA[index]) : 0;
        let b:number = resultB[index]? Number(resultB[index]) : 0;
        let itemResult:string = String(a + b + Number(bigLocation));
        if(itemResult.length > numLength) {
            bigLocation = itemResult[0];
            itemResult = itemResult.substring(1);
        } else {
            if(index !== bigResult.length -1 ){
                itemResult = itemResult.padStart(numLength, '0')
            }
            bigLocation = '0'
        }
        result.unshift(itemResult)
    })
    bigLocation !== '0' && result.unshift(bigLocation)
    return result.join('')
}

思路:

1. js中数字的最大精度范围为 Math.pow(2, 53) - 1 即 16 位,则设置分割长度 为 15位

2. 遍历原始数字从低位开始遍历,15位为一个元素 放入数组中

3. 挑选长度最大的数组遍历,下标相同的元素相加,设置进位变量,存储进位数值,相加后的结果放入结果数组