JavaScript大数相加

大数相加

手写一个 add 方法,实现两个大数相加

方案一

思路:判断两个字符串长度,通过补 0 的方式,让他们长度相同,由于我们在学生时代,这种加减法都是从右往左,所以,我们对数组进行反转,这样就可以让计算机按照我们的想法去实现,做的过程中,一定要考虑满 10 进 1 的情况,全部算完后,再反转回来,通过 join 合并成字符串进行返回。

//a和b都为字符串,调用add后,返回一个相加的字符串
//a='12345678'
//b='456789'
function add(a, b) {
  //获取各自长度
  let i = a.length,
    j = b.length;
  //判断谁大一些
  let len = i - j;
  let sum,
    sumArr = [];
  //谁小,就在谁的前面补0,让两个长度相同
  //a='12345678'  b='00456789'
  if (len > 0) {
    b = appendZero(b, len);
  } else if (len < 0) {
    //这个地方要把len变为正数
    a = appendZero(a, Math.abs(len));
    //当b的长度比a大时,就把b的长度给i
    i = j;
  }
  //由于日常运算都是从由往左,所以,我们反转数组
  let aArr = a.split('').reverse(),
    bArr = b.split('').reverse();
  for (let m = 0; m < i; m++) {
    //数组长度相同,同一个位置的两个元素相加
    //如果当前sumArr有值,说明可能是前面一位满10进了个1
    let c = parseInt(aArr[m]) + parseInt(bArr[m]) + (sumArr[m] || 0);
    if (c > 9) {
      //进10后,取余数
      sumArr[m] = c % 10;
      //如果大于10了,则会往数组后一个元素放一个1
      sumArr[m + 1] = parseInt(sumArr[m + 1] || 0) + 1;
    } else {
      sumArr[m] = c;
    }
  }
  //最后数组反转,再合并成一个字符串
  sum = sumArr.reverse.join('');
  return sum;
}

function appendZero(str, len) {
  for (let i = 0; i < len; i++) {
    str = '0' + str;
  }
  //或者使用ES6的repeat
  //str='0'.repeat(len)+str;
  return str;
}

方案二

function add(a, b) {
  (a = a.split('')), (b = b.split(''));
  let sum = [],
    go = 0;
  while (a.length || b.length) {
    //通过pop每次取一个
    let num1 = parseInt(a.pop()) || 0;
    let num2 = parseInt(b.pop()) || 0;
    //两值相加,如果有进位就 +go
    let tmp = num1 + num2 + go;
    if (tmp > 9) {
      go = 1;
      //取余数
      tmp %= 10;
    } else {
      go = 0;
    }
    //array.unshift(item)表示在数组array的最前面插入
    sum.unshift(tmp);
  }
  if (go) sum.unshift(1);
  return sum.join('');
}

通过 while 循环,其实也是对长度不够的进行补 0,通过 pop 巧妙的从最后取一个元素,跟前面的数组反转如出一辙。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值