一道鄙视题:
let a = '99999999999999';
let b = '9999';
console.log(bigAdd(a,b));
// 100000000009998
function bigAdd(str1, str2) {
let res = '';
let temp = 0;
str1 = str1.split('')
str2 = str2.split('')
while (str1.length || str2.length || temp) {
temp += ~~str1.pop() + ~~str2.pop()
res = (temp % 10) + res
temp = temp > 9
}
return res.replace(/^0+/, '')
}
掌握知识点
1. ~~ 表示按位取反
当~~的值不是数字的时候返回值是0,如果是字符串数字或者数字则返回本身
~~undefined -> 0
~~true -> 1 ~~false -> 0
~~'12' -> 12(Number)
2. Array.pop() 返回删除当前数组最后一个的元素 没有则返回undefined
3. % 取模运算 当一个数和比他大的数取模,值是自身 6 % 10 = 6
解题思路
1. 首先将str1,str2分割成数组
2. 然后循环,结束条件是两个数组长度都为0(没以元素了),temp是false(因为如果两个数组的元素都删除只剩下一个的时候,如果大于十要进1,那么要在走一次循环,因为~~undefined是0,~~true是1,1+0=1 不影响)
3. 就是利用小学的加法运算 各位加各位,十位加十位以此类推,然后利用字符串相加的特性
4. temp % 10 表示:因为两个单数相加最大就是18,那么和10取模就是当前的个位值
5. (temp % 10) + res :因为此时的temp已经是Number 所以要让他变成字符串(注意一定是让res在后面 这样顺序才对,因为当前的值是从右面开始的,eg: '1'+'2' ==12 '2'+'1' == 21)
6. temp = temp>9: 值是true或false ,经行加法运算的时候会转换成1或0
7. 如果当前res前面有0就要把他清空不然浏览器会误认为是XXX进制