您现在的位置:首页 >> 前端 >> 内容

两个字符串大整数用字符串表示算出它们乘积

时间:2017/9/9 9:10:00 点击:

  核心提示:两个字符串大整数用字符串表示算出它们乘积/*有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。 */var s1=7210654754847310623...

两个字符串大整数用字符串表示算出它们乘积

/*
    有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
 */

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

作者:网络 来源:SuperYuHuo