大整数的加减法运算(JavaScript版)
本文由 小茗同学 发表于 2016-11-08 浏览(7536)
最后修改 2024-07-08 标签:大整数 运算 加减

加法

原理很简单,就是从右往左遍历相加,有进位的就把左边的数加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 = Math.floor(temp / 10);
	}
	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"