项目Euler -Prob。 #20(Lua)

时间:2012-03-15 19:16:22

标签: lua sum project factorial

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将大数字转换为科学记数法,我不得不将其转换回标准符号。我不认为这是一个问题,尽管它可能是。

对此有任何解释吗?

1 个答案:

答案 0 :(得分:4)

不幸的是,正确的解决方案更加困难。这里的主要问题是Lua使用64bit floating point个变量,这意味着this适用。

长话说明:64位浮点数中的有效位数太小,无法存储像100这样的数字! Lua的浮点数最多可以存储52个尾数位,因此任何大于2 ^ 52的数字都将不可避免地受到舍入误差的影响,这会给你带来超过15位的十进制数字。要存储100 !,您至少需要158个十进制数字。 您的factorial()函数计算的数字合理地接近实际值100! (即相对误差很小),但您需要完全值才能获得正确的解决方案。

您需要做的是实现自己的算法来处理大数字。我实际上通过将每个数字存储为表来解决Lua中的问题,其中每个条目存储一个十进制数字的数字。完整的解决方案需要50多行代码,所以这不是一件好事,也不是一件好事。