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