前不久碰到过好几次这个笔试题,记录一下思路 总的来说就是先将数据转换成数组,缺位补0,定义好两个变量,一个是装结果的,一个是装进位或者借位的 然后就是遍历之后对应的元素一个加/减一个
大数相减
function bigNumSubtract(num1, num2) {
// 先数组化,为了方便借位 所以先反转
var num1List = num1.split('').reverse().map(Number);
var num2List = num2.split('').reverse().map(Number);
// 确保 num1 大于等于 num2
var isNegativeResult = false;
if (parseInt(num1) < parseInt(num2)) {
var temp = num1List;
num1List = num2List;
num2List = temp;
isNegativeResult = true;
}
while (num1List.length < num2List.length) {
num1List.push(0);
}
// 实际运算
var result = [];
var needBorrow = 0;
for (var i = 0; i < num1List.length; i++) {
var cur1 = num1List[i];
var cur2 = num2List[i] || 0;
var subtract = cur1 - cur2 - needBorrow;
if (subtract < 0) {
subtract += 10;
needBorrow = 1;
} else {
needBorrow = 0;
}
result.push(subtract);
}
// 去掉前导零
while (result[result.length - 1] === 0) {
result.pop();
}
var finalResult = result.reverse().join('');
if (isNegativeResult) {
finalResult = '-' + finalResult;
}
return finalResult;
}
console.log(bigNumSubtract('998', '888'));
console.log(bigNumSubtract('199', '888'));
同理,大数相加
function bigNumSum(num1, num2) {
// 先字符串化
var num1List = num1.split('').map(Number);
var num2List = num2.split('').map(Number);
// 确保 num1 和 num2 长度一致
while (num1List.length < num2List.length) {
num1List.unshift(0);
}
while (num1List.length > num2List.length) {
num2List.unshift(0);
}
// 实际运算
var result = [];
var carryOver = 0; // 进位标志
for (var i = num1List.length - 1; i >= 0; i--) {
var cur1 = num1List[i];
var cur2 = num2List[i];
var sum = cur1 + cur2 + carryOver;
if (sum >= 10) {
carryOver = 1;
sum -= 10;
} else {
carryOver = 0;
}
result.unshift(sum.toString());
}
// 如果最后还有进位,则添加到结果的最前面
if (carryOver === 1) {
result.unshift('1');
}
return result.join('');
}
console.log(bigNumSum('999', '888'));