我正在尝试解决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)
最佳答案
前 100 个整数的乘积是一个 1e158 量级的大数。这将被作为 float 处理,从而导致精度损失。请参阅The Floating Point Guide以获得更全面的解释。两次乘法的结果与 15 位有效数字匹配,但在第 16 位及以后有所不同。这足以抛出你的最终结果。
要正确执行此操作,您需要始终使用整数算术 - 这远远超出了 Javascript 的 native 功能。您需要处理 158 位数字,并自己编写乘法例程。
如果您使用字符串格式来存储数字,则脚本的第二部分只需对数字进行求和即可。
关于Javascript 没有给出正确的整数输出 -- Project Euler 20,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18907458/