http://projecteuler.net/problem=20 我已经编写了代码来解决这个问题,但是,在某些情况下它似乎是准确的,而在其他情况下则是不准确的。当我尝试将问题解决到10时(答案是有问题的,27)我得到27,正确答案。但是,当我尝试解决给定的问题(100)时,我得到64,答案不正确,因为答案是别的。
这是我的代码:
function factorial(num)
if num>=1 then
return num*factorial(num-1)
else
return 1
end
end
function getSumDigits(str)
str=string.format("%18.0f",str):gsub(" ","")
local sum=0
for i=1,#str do
sum=sum+tonumber(str:sub(i,i))
end
return sum
end
print(getSumDigits(tostring(factorial(100))))
64
由于Lua将大数字转换为科学记数法,我不得不将其转换回标准符号。我不认为这是一个问题,尽管它可能是。
对此有任何解释吗?
答案 0 :(得分:4)
不幸的是,正确的解决方案更加困难。这里的主要问题是Lua使用64bit floating point个变量,这意味着this适用。
长话说明:64位浮点数中的有效位数太小,无法存储像100这样的数字! Lua的浮点数最多可以存储52个尾数位,因此任何大于2 ^ 52的数字都将不可避免地受到舍入误差的影响,这会给你带来超过15位的十进制数字。要存储100 !,您至少需要158个十进制数字。 您的factorial()函数计算的数字合理地接近实际值100! (即相对误差很小),但您需要完全值才能获得正确的解决方案。
您需要做的是实现自己的算法来处理大数字。我实际上通过将每个数字存储为表来解决Lua中的问题,其中每个条目存储一个十进制数字的数字。完整的解决方案需要50多行代码,所以这不是一件好事,也不是一件好事。