我正在研究Project Euler,用JavaScript编写解决方案。然而,问题16似乎无法用Javascript解决:
215=32768,其数字之和为3+2+7+6+8=26。
数字21000的数字之和是多少?
因为JavaScript的64位精度不足以容纳这个数字,所以计算Math.pow(2, 1000)
得到1.0715086071862673e+301
。显然,我不能用这个值来解决问题,因为它不包含21000的所有数字。
有其他方法可以解决这个问题吗?请注意,我不是在问如何绕过精度问题;然而,如果这是唯一的解决方案,那就顺其自然吧。
理想情况下,我想找到这个问题的替代解决方案(也许是一种超级史诗般的数学方法?)。
(顺便说一句,我并不是想作弊,也不是想让答案脱离SO。我已经解决了它,但我必须使用Python)
可以通过将2^1000存储在(数字)数组中的简单方法来解决此问题。在不到一秒钟的时间内运行。来自这里的原创创意。
var number = [1],
sum = 0;
for(var i = 0; i < 1000; i++)
{
var overflow = 0,
count = number.length + 1
for(var j = 0; j < count; j++)
{
var digit = number[j] || 0;
digit = 2 * digit + overflow;
if(digit > 9)
{
digit -= 10;
overflow = 1;
}
else
{
overflow = 0;
}
number[j] = digit;
}
}
for(var i = 0; i < 1000; i++)
{
sum += number[i];
}
console.log(sum);
查看我之前问的一个问题:javascript 中的指数求和
回复谈到了JavaScript中的BigNumber。这将有助于您在处理大量数据时绕过JavaScript中的精度不足。