1. 大数相加
function addBigNum(a,b){
var res = '',
loc = 0;
a = a.split('');
b = b.split('');
while(a.length || b.length || loc){
//~~把字符串转换为数字,用~~而不用parseInt,是因为~~可以将undefined转换为0,当a或b数组超限,不用再判断undefined
//注意这里的+=,每次都加了loc本身,loc为true,相当于加1,loc为false,相当于加0
loc += ~~a.pop() + ~~b.pop();
//字符串连接,将个位加到res头部
res = (loc % 10) + res;
//当个位数和大于9,产生进位,需要往res头部继续加1,此时loc变为true,true + 任何数字,true会被转换为1
loc = loc > 9;
}
return res.replace(/^0+/,'');
}
2. 大数相乘
function multiplyBigNum(num1, num2) {
//判断输入是不是数字
if (isNaN(num1) || isNaN(num2)) return "";
let len1 = num1.length,
len2 = num2.length;
let pos = [];
//j放外面,先固定被乘数的一位,分别去乘乘数的每一位,更符合竖式演算法
for (let j = len2 - 1; j >= 0; j--) {
for (let i = len1 - 1; i >= 0; i--) {
//两个个位数相乘,最多产生两位数,index1代表十位,index2代表个位
let index1 = i + j,
index2 = i + j + 1;
//两个个位数乘积加上当前位置个位已累积的数字,会产生进位,比如08 + 7 = 15,产生了进位1
let mul = num1[i] * num2[j] + (pos[index2] || 0);
//mul包含新计算的十位,加上原有的十位就是最新的十位
pos[index1] = Math.floor(mul / 10) + (pos[index1] || 0);
//mul的个位就是最新的个位
pos[index2] = mul % 10;
}
}
//去掉前置0
let result = pos.join("").replace(/^0+/, "");
return result || '0';
}
参考: https://segmentfault.com/a/1190000015979292?utm_source=tag-newest
来源:oschina
链接:https://my.oschina.net/u/4271891/blog/4273376