zoukankan      html  css  js  c++  java
  • 有个问题需要将字符串(大数字)计算相加并转换成字符串,传递的参数是字符串。

    JS 的数字计算坑比较多的,浮点型的计算带有精度问题,所以通常先将浮点型变成整数进行计算,然后再以字符串的形式,变成浮点型输出。

    大数字计算会变成科学计数法,JS 中,数字超过21位就会变成科学计数法,例如:8100824045303269669937 -> 8.100824045303269e+21 ,这样会损失一些精度。

    分析了一下排名第一的代码:

    String.prototype.reverse = function() {
      return this.split('').reverse().join('');
    }
     
    function sumStrings(a,b) {
      a = a.reverse(); b = b.reverse();
      var carry = 0; //进位
      var index = 0; //位数
      var sumDigits = []; //结果
     
      while (index < a.length || index < b.length || carry != 0) {
        var aDigit = index < a.length ? parseInt(a[index]) : 0;
        var bDigit = index < b.length ? parseInt(b[index]) : 0;
        var digitSum = aDigit + bDigit + carry;
     
        sumDigits.push((digitSum % 10).toString());
        carry = Math.floor(digitSum / 10);
        index++;
      }
     
      sumDigits.reverse();
      while (sumDigits[0] == '0')  sumDigits.shift();
     
      return sumDigits.join('');
    }
     
    大体思路比较巧妙,先把数字倒过来然后按位计算,while 循环的条件用的很神。设置三个变量分别作为位数(index)、进位(carry)、结果(sumDigits),每次循环用 index 拿到对应位的数字加上上一个循环的进位,然后取10的余数以字符串形式存入结果数字,然后再取到本次运算的进位,下一个循环继续。最后处理输出即可。
  • 相关阅读:
    windows form之间传值方式
    .net几种页面传值得方式:
    .NET下的ORM框架介绍
    php+smarty批量生成静态文件
    Dedecms模块开发流程(一)
    php开启整站gzip(zlib)压缩最简单的方法
    coreseek实战(三):全文搜索在php中应用(使用api接口)
    coreseek实战(四):php接口的使用,完善php脚本代码
    php curl 多线程
    coreseek实战(一):windows下coreseek的安装与测试
  • 原文地址:https://www.cnblogs.com/feixiablog/p/9026252.html
Copyright © 2011-2022 走看看