我正在尝试解决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
现在,让我们尝试解决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
这里发生了什么?为什么不同的乘法顺序会给我不同的结果?另外,为什么没有一个结果能给出问题20的正确结果? (648)
答案 0 :(得分:2)
前100个整数的乘积是1e158的大数。这将作为浮点数处理,从而导致精度损失。有关更全面的解释,请参阅The Floating Point Guide。两次乘法的结果与15位有效数字匹配,但在第16次及以后有所不同。这足以抛出你的最终结果。
要做到这一点,你需要在整个过程中使用整数运算 - 这远远超出了Javascript的本机功能。你需要处理158个数字,然后自己编写一个乘法例程。
如果使用字符串格式存储数字,则脚本的第二部分只需要总计数字。