lua求阶乘发生溢出

function fact(n)
  if n == 0 then
    return 1
  end
  return n * fact(n-1)
end

for i=1, 100, 1 do
  print(i,fact(i)) --发生溢出
end
  • 通过使用lua的’bn’库可以解决这问题,从lbn下载lbn.tar.gz,

    tar -xzvf lbn.tar.gz
    cd bn

  • 修改Makefile如下

image

make
  • 在当前目录下会生成一个bn.so文件,将bn.so拷贝到代码文件所在目录,或者通过LUA_CPATH指定require搜索路径

    local bn = require “bn”

    function bn_fact(bn.number(n))
    if n:tonumber() == 0 then return 1 end
    return n * bn_fact(n-1)
    end

    function fact(n)
    return bn_fact(bn.number(n))
    end

    for i=1,100,1 do

    print(i,fact(i)) -- 未发生溢出
    

    end

Ref: 1.stackoverflow 2.http://webserver2.tecgraf.puc-rio.br/~lhf/ftp/lua/install.html