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

加法

原理很简单,就是从右往左遍历相加,有进位的就把左边的数加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"