大数就是超过整数最大上限的数,大数会被采用科学记数法的方式保存下来,这样就会导致最后的结果不准确。
通过观察,我们可以总结出我们在做加法的时候的规律。
即最小位数先相加,相加的结果个位数保留,有进位的参与到下一位的加法中。由此可看出,虽然大位的数虽然先读取到,但是是最后计算的,由此,我们可以用栈的实现方式来实现。
像上一篇文章一样,栈我们使用数组来表示
我们用三个栈分别存储和的个位数以及两个加数
let sum=function(a,b){
let sum=[];
let sA,sB,s=0;
//将大数一个个放入栈中,最后个位数要在栈顶
let numSplit=function(a){
return r=a.split("");
}
sA=numSplit(a);
sB=numSplit(b);
console.log(sA);
console.log(sB);
//运算
while(sA.length!=0 && sB.length!=0){
s=parseInt(sA[sA.length-1])+parseInt(sB[sB.length-1])+s;
//用这种方法来模拟出栈
sA.length--;
sB.length--;
sum.push(s%10);
//JavaScript的除法不是整除,此处s是和的存十位数
s=(s-s%10)/10;
//或者这样写,因为两个个位数相加,十位数最多是1
//s=s>9?1:0
}
//a比较多位的时候,sA栈会剩余
while(sA.length!=0){
sum.push(sA[sA.length-1]+s);
s=0;
sA.length--;
}
//b比较多位的时候,sB栈会剩余
while(sB.length!=0){
sum.push(sB[sB.length-1]+s);
s=0;
sB.length--;
}
//ab一样位数时,且和大于9时,还有进位
if(s!=0){
sum.push(s);
}
sum=sum.reverse().join("");
console.log(sum);
return sum;
}
//注意传的参数也必须是字符串,因为整数无法精确保留
sum("543453786253453534535","544532543434534538729533785");