如何在 Lua 中创建斐波那契数列?

我写了一个小程序,它创建斐波那契数列并返回所有偶数整数的总和。

该函数创建以下序列: 1、2、3、5、8、13、21、34、55

并返回其偶数的总和:44

但是,当我将停止索引从10更改为100时,在 for i = 3,100做中返回的总和为负数-8573983172444283806,因为值变得太大。 为什么我的代码对10有效,而对100无效?

点赞
用户3171657
用户3171657

在 5.3 版本之前,Lua 在内部始终将数字存储为浮点数。在 5.3 版本中,Lua 数字可以在内部存储为整数或浮点数。一种选择是运行 Lua 5.2,我认为你会发现你的代码在那里可以按照预期运行。另一种选择是使用浮点数初始化数组,这将将来对它们的所有操作提升为浮点数:

local fib = {1.0, 2.0}
2015-12-18 21:24:18
用户107090
用户107090

下面是一个事后写的hack。 代码利用了数学上的一个事实,即偶数斐波那契数恰好是在3的倍数索引处的数。 这使我们避免了测试非常大的数字的奇偶性,并且在浮点计算中提供了正确的高位数字。然后我们只关注低位数字并组合结果。输出是 286573922006908542050,与WA一致。在5到15之间的d的值运行良好。

a,b=0.0,1.0
s=0
d=10
for n=1,100/3 do
    a,b=b,a+b
    a,b=b,a+b
    s=s+b
    a,b=b,a+b
end
h=string.format("%.0f",s):sub(1,-d-1)
m=10^d
a,b=0,1
s=0
for n=1,100/3 do
    a,b=b,(a+b)%m
    a,b=b,(a+b)%m
    s=(s+b)%m
    a,b=b,(a+b)%m
end
s=string.format("%0"..d..".0f",s)
print(h..s)
2015-12-19 01:23:22