3

我编写了一个小脚本来创建斐波那契数列并返回所有偶数的总和。

function even_fibo()
  -- create Fibonacci sequence
  local fib = {1, 2}  -- starting with 1, 2
  for i=3, 10 do
    fib[i] = fib[i-2] + fib[i-1]
  end
  -- calculate sum of even numbers
  local fib_sum = 0
  for _, v in ipairs(fib) do
    if v%2 == 0 then
      fib_sum = fib_sum + v
    end
  end
  return fib_sum
end

fib = even_fibo()
print(fib)

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

并返回其偶数之和:44

但是,当我将停止索引从 更改为 时10100返回for i=3, 100 do的总和为负数-8573983172444283806,因为值变得太大。为什么我的代码适用于10而不适用于100

4

2 回答 2

3

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

local fib = {1.0, 2.0}
于 2015-12-18T21:24:18.710 回答
2

这是事后写的一个hack。该代码利用了这样一个数学事实,即偶数斐波那契数恰好是指数为 3 的倍数的那些。这使我们能够避免测试非常大的数字的奇偶性,并在您进行浮点计算时提供正确的高位数字-观点。然后我们重做它,只查看低位数字并组合结果。输出为286573922006908542050,与WA一致。d5 到 15 之间的值可以正常工作。

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-19T01:23:22.623 回答