大数相加减

82 阅读1分钟

前不久碰到过好几次这个笔试题,记录一下思路 总的来说就是先将数据转换成数组,缺位补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'));