大整数求和
Sum Big Integers
我目前陷入了 Codewars 挑战,我无法解决问题:
给定两个整数的字符串表示,return这些整数的字符串表示,例如sumStrings('1','2') // => '3'
到目前为止我使用了以下代码,但是由于数字被转换为科学记数法,所以它在大量测试用例上失败了:
function sumStrings(a,b) {
var res = +a + +b;
return res.toString();
}
如有任何帮助,我们将不胜感激。
编辑:
Fiddle 示例:https://jsfiddle.net/ag1z4x7d/
问题是在那个特定的型 (IIRC) 中,存储在 a
和 b
中的数字对于常规的 32 位整数来说太大了,而且浮点运算不精确.因此,您的版本没有 return 正确的值:
sumStrings('100000000000000000000', '1')
// returns '100000000000000000000' instead of '100000000000000000001'
你必须确保这不会发生。一种方法是进行良好的老式基于进位的加法,并在整个计算过程中保持在基于 digit/character 的世界中:
function sumStrings(a, b) {
var digits_a = a.split('')
var digits_b = b.split('')
...
}
function sumStrings(a, b) { // sum for any length
function carry(value, index) { // cash & carry
if (!value) { // no value no fun
return; // leave shop
}
this[index] = (this[index] || 0) + value; // add value
if (this[index] > 9) { // carry necessary?
carry.bind(this)(this[index] / 10 | 0, index + 1); // better know this & go on
this[index] %= 10; // remind me later
}
}
var array1 = a.split('').map(Number).reverse(), // split stuff and reverse
array2 = b.split('').map(Number).reverse(); // here as well
array1.forEach(carry, array2); // loop baby, shop every item
return array2.reverse().join(''); // return right ordered sum
}
document.write(sumStrings('999', '9') + '<br>');
document.write(sumStrings('9', '999') + '<br>');
document.write(sumStrings('1', '9999999999999999999999999999999999999999999999999999') + '<br>');
我目前陷入了 Codewars 挑战,我无法解决问题:
给定两个整数的字符串表示,return这些整数的字符串表示,例如sumStrings('1','2') // => '3'
到目前为止我使用了以下代码,但是由于数字被转换为科学记数法,所以它在大量测试用例上失败了:
function sumStrings(a,b) {
var res = +a + +b;
return res.toString();
}
如有任何帮助,我们将不胜感激。
编辑:
Fiddle 示例:https://jsfiddle.net/ag1z4x7d/
问题是在那个特定的型 (IIRC) 中,存储在 a
和 b
中的数字对于常规的 32 位整数来说太大了,而且浮点运算不精确.因此,您的版本没有 return 正确的值:
sumStrings('100000000000000000000', '1')
// returns '100000000000000000000' instead of '100000000000000000001'
你必须确保这不会发生。一种方法是进行良好的老式基于进位的加法,并在整个计算过程中保持在基于 digit/character 的世界中:
function sumStrings(a, b) {
var digits_a = a.split('')
var digits_b = b.split('')
...
}
function sumStrings(a, b) { // sum for any length
function carry(value, index) { // cash & carry
if (!value) { // no value no fun
return; // leave shop
}
this[index] = (this[index] || 0) + value; // add value
if (this[index] > 9) { // carry necessary?
carry.bind(this)(this[index] / 10 | 0, index + 1); // better know this & go on
this[index] %= 10; // remind me later
}
}
var array1 = a.split('').map(Number).reverse(), // split stuff and reverse
array2 = b.split('').map(Number).reverse(); // here as well
array1.forEach(carry, array2); // loop baby, shop every item
return array2.reverse().join(''); // return right ordered sum
}
document.write(sumStrings('999', '9') + '<br>');
document.write(sumStrings('9', '999') + '<br>');
document.write(sumStrings('1', '9999999999999999999999999999999999999999999999999999') + '<br>');