有一定的编程经验的人都知道,当我们对数据操作的时候,若数据过大,计算机将这个大数从十进制的转为二进制的,是没有那个类型的放的了的,因此,我们经常将一个大数转化为字符串来操作。接下来我将演示大整数的加法、乘法、除法操作。
附:不考虑负数
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];//结果返回[商,余数]
}