我试图将两个大数字相加,存储为字符串。
这是我到目前为止所拥有的:
function addBigNums(a,b){
c = ""; // output
o = 0; // carryover
startLen = a.length-1;
for(i = startLen; i >= 0; i--) {
sum = parseInt(a[i], 10) + parseInt(b[i], 10) + o;
c = (sum % 10) + c;
o = sum >= 10;
}
if(o === true) c = "1" + c;
return c;
}
我遇到了两个问题:
1)我的携带并不总是正常运作,主要是在:
2)数字长度不同。
现在我认为我必须在0到0之前加上较短的数字,以使其按预期运行。
还有更好的选择吗?
答案 0 :(得分:0)
将这两个数字视为数字数组。添加它们从右到左处理溢出标志。 Demo。假设你的号码长度相同
function getNumber(len) {
return Array.apply(null, new Array(len)).map(function(){
return Math.floor(Math.random()*9);
}).join('');
}
var len = 600,
a = getNumber(len), //use your numbers here
b = getNumber(len),
flag = 0;
var c = [].reduceRight.call(a, function(acc, val, idx) {
val = +val + (+b.charAt(idx)) + flag;
flag = val / 10 | 0;
val %= 10;
return val + acc;
}, '');
c = (flag ? 1: '') + c;
console.log(a, b, c);
答案 1 :(得分:0)
简单,直接的整数加法,就像你手动完成一样:
a = "123456"; // input a
b = "123456"; // input b
c = ""; // target-string
o = 0; // overflow-bit
// traverse string from right to left
for(i = a.length - 1; i >= 0; i--) {
// do the calculation (with overflow bit)
sum = parseInt(a[i]) + parseInt(b[i]) + o;
// prepend resulting digit to target
c = (sum % 10) + c;
// set overflow bit for next round
o = sum >= 10;
}
// prepend another "1" if last overflow-bit is true
if(o == true) c = "1" + c;
如果字符串a和b的长度不相等(但你说它们是相同的),你应该在计算之前用短零作为前缀加上较短的字符串。