加法
原理很简单,就是从右往左遍历相加,有进位的就把左边的数加1:
/**
* 大整数加法,不考虑小数和负数
*/
function add(a, b)
{
a = a.split('');
b = b.split('');
var jinwei = 0, result = '';
// 这里一定不要忘了加上“ || jinwei”,否则最后面一个进位会被漏掉
while(a.length || b.length || jinwei)
{
var temp = parseInt(a.pop() || 0) + parseInt(b.pop() || 0) + jinwei;
result = temp % 10 + result;
jinwei = Math.floor(temp / 10);
}
return result;
}
测试用例:
add('1234', '39'); // "1273"
add('1234', '9876'); // "11110"
add('14', '34251'); // "34265"
减法
减法最好先判断两个数谁大,因为大数减小数更方便一点,如果交换了,减完之后在最前面加上个负号:
/**
* 大整数减法,不考虑小数和负数
*/
function minus(a, b)
{
a = a.split('');
b = b.split('');
var aMaxb = a.length > b.length; // 标记A是否大于B
if(a.length == b.length)
{
for(var i=0, len=a.length; i<len; i++)
{
if(a[i] == b[i]) continue;
aMaxb = a[i] > b[i];
break;
}
}
if(!aMaxb) a = [b, b = a][0]; // 只要A不比B大都交换
var result = '';
while(a.length)
{
var temp = parseInt(a.pop()) - parseInt(b.pop() || 0);
if(temp >= 0) result = temp + result;
else
{
result = temp + 10 + result;
a[a.length-1]--; // 由于已经保证了a一定大于等于b,所以不存在a[i-1]为undefined的情况
}
}
return (aMaxb?'':'-') + result.replace(/^0*/g, ''); // 去掉前面可能的无效0
}
测试用例:
minus('1672', '99'); // "1573"
minus('1672', '6329'); // "-4657"
minus('1672', '1131'); // "541"
minus('1672', '66429'); // "-64757"