题目:两个非负大整数相加
解法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. 挑选长度最大的数组遍历,下标相同的元素相加,设置进位变量,存储进位数值,相加后的结果放入结果数组