美文网首页
大数相加代码分析

大数相加代码分析

作者: AAA前端 | 来源:发表于2019-06-21 18:27 被阅读0次
    • 今天看到一段代码,实现两个比较大的数相加。当然有其他简单的方法解决,这里仅仅分析一下;
    function sumString (a,b){
      var res = '', c=0;
      a = a.split('');
      b = b.split('');
      while(a.length || b.length || c){
        console.log(c)
        c += ~~a.pop() + ~~b.pop()
        console.log(c)
        res= c % 10 +res;    
        c = c > 9;
        console.log('一次循环结束',c, res)
      }
      return res.replace(/^0+/, '')
    }
    
    console.log(sumString('23', '119'))
    
    
    • 控制台结果
    0
    12
    一次循环结束 true 2
    true
    4
    一次循环结束 false 42
    false
    1
    一次循环结束 false 142
    142
    
    • 分析一下

    a = a.split(''); b = b.split('');

    • 这里把两个数变成了两个数组 a= [2,3] b=[1,1,9]

    while(a.length || b.length || c){

    • 循环的条件 a数组 或者 b数组仍然有值,并且变量c(是一个判断有没有进1的变量)为true时继续进入里面了

    c += ~~a.pop() + ~~b.pop()

    • 这里 a.pop() 获取数组最后一项,并且原数组减少最后一项。
    • ~~是取整 类似还有方法还有
      *** 8.9|0
      *** 8.9>>0
      *** 8.9<<0
    • c+= 等于 c = c+ ... 在这里 c为true为转换为1 false转换为0

    res= c % 10 +res;

    • res 保存着每一次循环之后的记录的值。从个位往高位保存;

    c = c > 9;

    • 每次循环后记录本次计算是否进一位。 其实我觉得写成这个样更有语义化 c = c > 9 ? 1 : 0;

    return res.replace(/^0+/, '')

    • 循环之后返回 去掉以0开始的多个连续0字符串;
    • 第一次循环 3 + 9 = 12
      res 为个位数 2 c由于大于9 为true

    • 第二吃循环 2 + 1 = 3
      c = true + 2 + 1 相当于 1+2+1 = 4;
      res 等于 4 + 上一次循环保存的个位数 2 = 42
      c < 9 为 false

    *第三次循环
    [].pop() 为undefined ~~[].pop()为0
    c = false + 0 + 1 = 1
    res = 1+ 上次循环保存的两位数42 = 142
    c<9 为false

    • 此时 a.length ==0 b.length==0 c = false 跳出循环 返回 142

    相关文章

      网友评论

          本文标题:大数相加代码分析

          本文链接:https://www.haomeiwen.com/subject/qrpuqctx.html