大数相加代码分析

  • 今天看到一段代码,实现两个比较大的数相加。当然有其他简单的方法解决,这里仅仅分析一下;
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

你可能感兴趣的:(大数相加代码分析)