求两个不超过 200位的非负整数的和。

6 篇文章 0 订阅
1 篇文章 0 订阅

今天看到一道题:

输入格式

有两行,每行是一个不超过 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));//前面那个参数主要是为了在控制台输出一个红色的字体

 结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值