最近报了个提高班,有个单元测试作业是大数相加,依稀记得以前用C语言写过类似的东西,可能时间太久远了,现在已经毫无印象了。
先说一下我理解的大数相加,因为js存储number类型的大小是有限制的,我查了查最大值为1.7976931348623157 × 10的308次方,如果超过这个大小的话,计算就有误差,所以就不能直接相加了。解决的思路就是用字符串模拟数字加法,逐位相加放入数组中就可以了,有思路后写起来就比较easy了。
这是我写的比较low,懒得改了
function add(a, b) {
var arry = [],
length_a = a.length,
length_b = b.length,
flag = 0;
a = a.split('').reverse();
b = b.split('').reverse();
for(let i = 0; i < Math.max(length_a, length_b); i++) {
if(parseInt(a[i]) == undefined) {
parseInt(a[i]) = 0
}
if(parseInt(b[i]) == undefined) {
parseInt(b[i]) = 0
}
var sum = parseInt(a[i]) + parseInt(b[i]);
if(i == Math.max(length_a, length_b) - 1) {
if(sum + flag >= 10) {
arry.push(sum + flag - 10)
arry.push('1')
} else {
arry.push(sum + flag)
}
} else {
if(sum + flag >= 10) {
arry.push(sum + flag - 10)
flag = 1;
} else {
arry.push(sum + flag)
flag = 0;
}
}
}
return arry.reverse().join('').toString()
}
add('843529812342341234','236124361425345435')
写的过程中容易漏到的有两点
<1>两个字符串长度有可能不一致
<2>考虑最后一位相加大于10的情况
下面是别人的精简版
function add(a, b) {
var n1 = a.length;
var n2 = b.length;
for(let i = 0; i < Math.max(n1, n2) - Math.min(n1, n2); i++) {
if(n1 > n2) b = '0' + b;
if(n1 < n2) a = '0' + a;
}
a = a.split('').reverse();
b = b.split('').reverse();
//split()基于指定的分隔符将一个字符串分隔成多个子字符串, 并将结果放在一个数组中
//reverse() 反转数组项的顺序
var n = Math.max(n1, n2);
var result = Array.apply(this, Array(n)).map((item, i) => {
return 0;
})
//生成一个长度为n的每个元素都为0的数组
for(let k = 0; k < n; k++) {
var temp = parseInt(a[k]) + parseInt(b[k])
if(temp > 9) {
result[k] += temp - 10;
result[k + 1] = 1;
} else {
result[k] += temp;
}
}
//parseInt() 解析一个字符串,并返回整数
return result.reverse().join('').toString()
}