js 大整数加法、乘法、除法

有一定的编程经验的人都知道,当我们对数据操作的时候,若数据过大,计算机将这个大数从十进制的转为二进制的,是没有那个类型的放的了的,因此,我们经常将一个大数转化为字符串来操作。接下来我将演示大整数的加法、乘法、除法操作。

附:不考虑负数

1、大整数加法

思路:我们将两个数进行逆序转换,然后按位进行相加,将相加的结果进行与10相除,商为进位,余数为当前位要保留的数。

//大整数加法
function big_add(a,b){
	var min_str=a.length<b.length?a.split("").reverse():b.split("").reverse();
	var max_str=a.length>=b.length?a.split("").reverse():b.split("").reverse();
	var quotient=0,remainder=0;
	var resutl=[];
	var temp=0;
	for(var i=0;i<min_str.length;i++){
		temp=parseInt(min_str[i])+parseInt(max_str[i])+quotient;
		quotient=parseInt(temp/10);//进位
		remainder=temp%10;//余数
		resutl.push(remainder);
	}
	for(i;i<max_str.length;i++){
		temp=parseInt(max_str[i])+quotient;		
		quotient=temp/10;//进位
		remainder=temp%10;//余数
		resutl.push(remainder);
		if(temp<10&&i<max_str.length-1){			
			return max_str.slice(i+1).reverse().join("")+resutl.slice().reverse().join("");
		}
	}
	return resutl.reverse().join("");
}

2、大整数乘法

//大数乘法
function multi(a,b){
    var str1,str2,len1,len2,maxlen,result = [];
    str1 = a.split("").reverse(); 
    str2 = b.split("").reverse();
    len1 = str1.length;
        len2 = str2.length;
//因为要在下一步做累加,如果不初始化为0,result[]中的值会变为NaN
//因为未初始化的数组中的值为undefined
    for(var i = 0;i < len1;i++)
        for(var j = 0;j < len2;j++)
            result[i + j] = 0;
    for(var i = 0;i < len1;i++)
        for(var j = 0;j < len2;j++)
    //根据乘法的手动计算方式,在上下相同位上会有相加
            result[i + j] += parseInt(str1[i]) * parseInt(str2[j]);
    var n = result.length;
    for(var k = 0;k < n-1;k++)
    {
        var temp = result[k];
        if(temp >= 10)
        {
            result[k] = temp % 10;
            //JS中的"/"不是除法取整,会取得小数,所以要用Math.floor()
            result[k + 1] +=  parseInt(temp / 10);
        }
    }
    return result.reverse().join("");
}

3、大整数除法

参考:https://www.cnblogs.com/fightformylife/p/4022058.html

//利用"模n取余法"模拟手动除法
//a/b   a>b
function big_div(a,b){
	var alen=a.length,blen=b.length;
	var quotient=0,remainder=0;
	var result=[],temp=0 ;
	for(var i=0;i<alen;i++){
		temp=remainder*10+parseInt(a[i]);
		if(temp<b){
			remainder=temp;
			result.push(0);
		}else{
			quotient=parseInt(temp/b);
			remainder=temp%b;
			result.push(quotient);
		}
		
	}
	return [result.join("").replace(/\b(0+)/gi,""),remainder];//结果返回[商,余数]
}

 

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/meimeilive/article/details/82431466
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞