大数相乘

本文介绍了一种不依赖于内置大整数类型实现两个大整数相乘的方法。通过将字符串形式的大整数转换为数组,并分别进行逐位相乘,最后合并计算结果得到最终的乘积。
/*
    有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
 */

var s1='72106547548473106236',
    s2='982161082972751393';
// 字符串转为数组
n1=s1.split('');
n2=s2.split('');
// 将数组每一项转为整数
n1.forEach(function (t,i) { n1[i]=parseInt(t); });
n2.forEach(function (t,i) { n2[i]=parseInt(t); });

var res=[];
var tempRes=[];
// 将n2的每一项与n1的每一项相乘
for(var i=n2.length-1;i>=0;i--){
    var curIncrement=0,nextIncrement; // curIncrement当前需要额外加上的进位,nextIncrement当前需要向下进的位

    tempRes=[];
    var k=n2.length-1-i;
    while (k--){
      tempRes.push(0);
    }

    for(var j=n1.length-1;j>=0;j--){
        var prod=n2[i]*n1[j]+curIncrement;

        nextIncrement=prod<10?0:Math.floor(prod/10);

        curIncrement=nextIncrement;
        if(j===0&&nextIncrement!==0){
            // 潜在的问题: unshift效率低下
            tempRes.unshift(Math.floor(prod%10));
            tempRes.unshift(Math.floor(nextIncrement));
        }else{
            tempRes.unshift(Math.floor(prod%10));
        }


    }

    res=arrPlus(res,tempRes);
}


// 将两个数组在对应位上相加 arrPlus([8,7,0,1],[9,9,2,3,4,0]=[1,0,0,1,0,4,1]
function arrPlus(arr1,arr2) {
    var p1=arr1.length,
        p2=arr2.length;

    var arrLonger=p1>p2?arr1:arr2;
    var arrShorter=p1>p2?arr2:arr1;
    // 将短的数组高位补0
    var t=arrLonger.length-arrShorter.length;
    while (t--){
        arrShorter.unshift(0);
    }

    var curIncrement=0,nextIncrement;
    for(var i=arrLonger.length-1;i>=0;i--){

        var sum=arrLonger[i]+arrShorter[i]+curIncrement;

        nextIncrement=sum<10?0:Math.floor(sum/10);

        curIncrement=nextIncrement;

        if(i===0&&nextIncrement!==0){
            arrLonger[i]=Math.floor(sum%10);
            arrLonger.unshift(nextIncrement);
        }else{
            arrLonger[i]=Math.floor(sum%10);
        }

    }

    return arrLonger;

 }

console.log(res.join('')); // 70820244829634538040848656466105986748

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值