今天看到一道题:
输入格式
有两行,每行是一个不超过 200200 位的非负整数,可能有多余的前导 00。
输出格式
一行,即相加后的结果。结果里不能有多余的前导 00,即如果结果是 342342,那么就不能输出为 03420342。
话不多说,上代码!
let a = '202222222002222222222222';
let b = '00893278749824874297848248';
// let a = '000099';
// let b = '00099';
let sumBigNum = function(a,b){
let aArr = [], bArr =[],sArr =[];
aArr = stringToArr(a);
bArr = stringToArr(b);
function stringToArr(arr){
let isZeroBegain = null
let tempArr =[];
for(let i of arr){
if(i*1!=0&&isZeroBegain==null){//如果数据不为0 并且这个数据之前还没有非零的数据
isZeroBegain = false;
tempArr.push(i*1);
}
else if(isZeroBegain==false){//这个isZeroBegain为false说明之前已经有非零的数据了 之前后面的数据全部加入数组
tempArr.push(i*1);
}
else if(i*1==0&&isZeroBegain==null){//isZeroBegain数据为null说明还没有非零的数据 并且这个数据也为0 那就不处理
}
}
return tempArr;
};
function sumNum(aArr=[],bArr=[]){
let loopNum = (aArr.length>=bArr.length)?aArr.length:bArr.length; //循环的次数 必须取长的数组 比如 99999+3 取短的不好实现
let smallLength = (aArr.length>=bArr.length)?bArr.length:aArr.length;
let overflow = 0;//每次计算相加超出10溢出的数据
let tempIndex = 0;
let sumString = '';
aArr.reverse();
bArr.reverse();
while(tempIndex<loopNum){
let tempSum = null;
if(overflow==0){
if(aArr[tempIndex]==undefined||bArr[tempIndex]==undefined){//两个中有一个是undefined 就说明后面长一点的数据直接不用计算了
sumString = sumString + ((aArr[tempIndex]!=undefined)?aArr.slice(tempIndex,aArr.length).join(''):bArr.slice(tempIndex,bArr.length).join(''))
break;
}
else{
tempSum = (aArr[tempIndex]+bArr[tempIndex]).toString();
}
}else{
if(aArr[tempIndex]==undefined||bArr[tempIndex]==undefined){
let tempValue = aArr[tempIndex]!=undefined?aArr[tempIndex]:bArr[tempIndex]
tempSum = (tempValue+overflow*1).toString();
}
else{
tempSum = (aArr[tempIndex]+bArr[tempIndex]+overflow*1).toString();
}
}
if(tempSum.length>1){
sumString = sumString+ (tempSum.substring(1,2)+'');
overflow = tempSum.substring(0,1)*1
}else{
overflow = 0;
sumString =sumString+(tempSum+'')
}
tempIndex++
}
if(overflow!=0){
sumString = sumString + (overflow+'')
}
return sumString.split('').reverse().join('');
}
return sumNum(aArr,bArr);
}
console.log('\x1B[31m%s\x1B[0m',sumBigNum(a,b));//前面那个参数主要是为了在控制台输出一个红色的字体
结果