手写一个add方法,实现两个大数相加
方案一
思路:判断两个字符串长度,通过补0的方式,让他们长度相同,由于我们在学生时代,这种加减法都是从右往左,所以,我们对数组进行反转,这样就可以让计算机按照我们的想法去实现,做的过程中,一定要考虑满10进1的情况,全部算完后,再反转回来,通过join合并成字符串进行返回。
// a 和 b 都为字符串,调用add后,返回一个相加的字符串
// a = '12345678'
// b = '456789'
function add(a, b) {
// 获取各自长度
let i = a.length,
j = b.length;
// 判断谁大一些
let len = i - j;
let sum,
sumArr = [];
// 谁小,就在谁的前面补0,让两个长度相同
// a = '12345678' b = '00456789'
if (len > 0) {
b = appendZero(b, len);
} else if (len < 0) {
// 这个地方要把len变成正数
a = appendZero(a, Math.abs(len));
// 当b的长度比a大时,就把b的长度给i
i = j;
}
// 由于日常运算都是从右往左,所以,我们反转数组
let aArr = a.split("").reverse(),
bArr = b.split("").reverse();
for (let m = 0; m < i; m++) {
// 数组长度相同,同一位置的两个元素相加
// 如果当前sumArr有值,说明可能是前面以为满10进了一个1
let c = parseInt(aArr[m]) + parseInt(bArr[m]) + (sumArr[m] || 0);
if (c > 9) {
// 进10后,取余数
sumArr[m] = c % 10;
// 如果进10了,则会往数组后一个元素放一个1
sumArr[m + 1] = parseInt(sumArr[m + 1] || 0) + 1;
} else {
sumArr[m] = c;
}
}
// 最后数组反转,再合并成一个字符串
sum = sumArr.reverse().join("");
return sum;
}
function appendZero(str, len) {
for (let i = 0; i < len; i++) {
str = "0" + str;
}
// 或者使用ES6的repeat
// str = '0'.repeat(len) + str;
return str;
}
方案二
function add(a, b) {
// 获取各自长度
(a = a.split("")), (b = b.split(""));
let sum = [],
go = 0;
while (a.length || b.length) {
// 通过pop每次取一个
let num1 = parseInt(a.pop()) || 0;
let num2 = parseInt(b.pop()) || 0;
// 两值相加,如果有进位就 + go
let tmp = num1 + num2 + go;
if (tmp > 9) {
go = 1;
// 取余数
tmp %= 10;
} else {
go = 0;
}
// array.unshift(item)表示在数组array的最前面插入
sum.unshift(tmp);
}
if (go) sum.unshift(1);
return sum.join("");
}
通过while循环,其实也是对长度不够的进行补0,通过pop巧妙的从最后取一个元素,跟前面的数组反转如出一辙.