手写一个add方法,实现两个大数相加
参考答案:
思路:判断两个字符串长度,通过补0的方式,让他们长度相同,由于我们在学生时代,这种加减法都是从右往左,所以,我们对数组进行反转,这样就可以让计算机按照我们的想法去实现,做的过程中,一定要考虑满10进1的情况,全部算完后,再反转回来,通过join合并成字符串进行返回。
1// a 和 b 都为字符串,调用add后,返回一个相加的字符串 2// a = '12345678' 3// b = '456789' 4function add(a,b){ 5 // 获取各自长度 6 let i = a.length,j = b.length; 7 // 判断谁大一些 8 let len = i - j; 9 let sum,sumArr = []; 10 // 谁小,就在谁的前面补0,让两个长度相同 11 // a = '12345678' b = '00456789' 12 if(len > 0){ 13 b = appendZero(b,len); 14 }else if(len<0){ 15 // 这个地方要把len变成正数 16 a = appendZero(a,Math.abs(len)); 17 // 当b的长度比a大时,就把b的长度给i 18 i = j; 19 } 20 // 由于日常运算都是从右往左,所以,我们反转数组 21 let aArr = a.split('').reverse(), bArr = b.split('').reverse(); 22 for(let m = 0;m < i;m++){ 23 // 数组长度相同,同一位置的两个元素相加 24 // 如果当前sumArr有值,说明可能是前面以为满10进了一个1 25 let c = parseInt(aArr[m])+parseInt(bArr[m]) + (sumArr[m] || 0); 26 if(c > 9){ 27 // 进10后,取余数 28 sumArr[m] = c%10; 29 // 如果进10了,则会往数组后一个元素放一个1 30 sumArr[m+1] = parseInt(sumArr[m+1] || 0)+1; 31 }else{ 32 sumArr[m] = c; 33 } 34 } 35 // 最后数组反转,再合并成一个字符串 36 sum = sumArr.reverse().join(''); 37 return sum; 38} 39 40function appendZero(str,len){ 41 for(let i=0;i<len;i++){ 42 str='0'+str; 43 } 44 // 或者使用ES6的repeat 45 // str = '0'.repeat(len) + str; 46 return str; 47} 48
1function add(a,b){ 2 // 获取各自长度 3 a = a.split(''), b = b.split(''); 4 let sum=[],go=0; 5 while(a.length || b.length){ 6 // 通过pop每次取一个 7 let num1 = parseInt(a.pop()) || 0; 8 let num2 = parseInt(b.pop()) || 0; 9 // 两值相加,如果有进位就 + go 10 let tmp = num1 + num2 + go; 11 if(tmp > 9){ 12 go = 1; 13 // 取余数 14 tmp %= 10; 15 }else{ 16 go = 0; 17 } 18 // array.unshift(item)表示在数组array的最前面插入 19 sum.unshift(tmp) 20 } 21 if(go) sum.unshift(1); 22 return sum.join(''); 23}
通过while循环,其实也是对长度不够的进行补0,通过pop巧妙的从最后取一个元素,跟前面的数组反转如出一辙.
最近更新时间:2021-07-25