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];//结果返回[商,余数]
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值