0

我正在尝试解决Project Euler Problem 20,虽然我认为解决方案非常简单,但事实证明 Javascript 并没有给我正确的输出:

var fact = 1;
for (var i = 100; i > 0; i--) {
    fact *= i;
}

var summed = 0;
while (fact > 0) {
    summed += Math.floor(fact % 10);
    fact = fact / 10;
}

console.log(summed); //587

http://jsfiddle.net/9uEFj/

现在,让我们尝试解决 100!从底部开始(即 1 * 2 * 3 * ... * 100 而不是 100 * 99 * .. * 1 像以前一样):

var fact = 1;
for (var i = 1; i <= 100; i++) {
    fact *= i;
}

var summed = 0;
while (fact > 0) {
    summed += Math.floor(fact % 10);
    fact = fact / 10;
}

console.log(summed); //659

http://jsfiddle.net/YX4bu/

这里发生了什么?为什么不同的乘法顺序会给我不同的结果?另外,为什么没有一个结果给我问题 20 的正确结果?(648)

4

1 回答 1

2

前 100 个整数的乘积是 1e158 量级的大数。这将作为浮点数处理,从而导致精度损失。有关更完整的说明,请参阅浮点指南。两次乘法的结果与 15 位有效数字匹配,但在 16 位及以后有所不同。这足以抛出你的最终结果。

要正确执行此操作,您需要在整个过程中使用整数运算——这远远超出了 Javascript 的本机功能。您需要处理 158 位数字,并自己编写一个乘法例程。

如果您使用字符串格式来存储数字,则脚本的第二部分只需要计算数字的总和。

于 2013-09-20T01:27:02.740 回答