• [CodeWars][JS]实现大整数加法


    问题描述

    实现‘字符串加法’,即将两个以字符串形式表示的数字相加,得到结果然后返回一个新的字符串。

    例如:输入‘123’,‘321’,返回‘444’。

    这样在进行两个任意大的整数相加的时候,既不会溢出,也不会损失精度。

    解决方案

    1 我的解决方案

    function sumStrings(a,b) {
      var result = [], count = 0;
    
      if(a.length < b.length)  b=[a, a=b][0];
      b=Array(a.length-b.length+1).join('0')+b;
      
      var arrA = a.split('');
      var arrB = b.split('');
      for(var j=0; j<a.length; j++) {
        var temp = (Number(arrA.pop()) + Number(arrB.pop())) +count;
        temp>=10?[temp,count]=[temp-10,1]:count=0;
        result.push(temp);
      }
      result.push(count);
      
      return result.reverse().join('').replace(/^0+/,'');
    }
    

    实现分两步:

    1 为输入中较小的一个数前端补0,使得两个数一样长。在那之前为了确定给哪个数补0首先进行了一次比较。

    2 将两个数的最后一位依次pop出,进行相加,并存储到result数组中。如果相加的结果大于10,取个位数部分,并使得进位符号count+1。简单来说就像小学时学加法那样,按部就班就对了。

    最后得到result数组,还不是我们要的结果,我们需要对它反转,然后转换成字符串,还有去除最前面的0.

    2 其他人的解决方案

    function sumStrings(a,b){
        var res='', c=0;
        a = a.split('');
        b = b.split('');
        while (a.length || b.length || c){
            c += ~~a.pop() + ~~b.pop();
            res = c % 10 + res;
            c = c>9;
        }
        return res.replace(/^0+/,'');
    }
    

    一看之下简洁了不止一点点……
    改进的地方在于:

    1. 没有上面提到的第一步,不用补0,不用判断哪个数大,如此一来清楚了不少。

    2. 没有使用count变量代表进位,直接将相加结果和进位变量记录在了一个变量c里,

    3. 使用 ~~a 而不是Number(a)来进行格式转换。

  • 相关阅读:
    Nginx的编译,和简单的配置问题
    项目课DNS主域名解析服务器(四)
    项目课DHCP服务(三)
    项目课PXE自动装机(二)
    Nginx 详细讲解
    ansible批量管理工具的搭建与简单的操作
    SUID,SGID,SBIT这些到底是什么
    密码截取
    分治和递归的算法实现求数组A[n]中的前k个最大数
    回溯法实现求1n个自然数中r个数的组合
  • 原文地址:https://www.cnblogs.com/kindofblue/p/4672129.html
Copyright © 2020-2023  润新知