欧拉计划问题#20的算法效率低下。
2015-1-22 18:59:49
收藏:0
阅读:182
评论:2
这是我正在尝试解决的问题:http://projecteuler.net/problem=20 (找到100!中数字的总和)
我正在使用Lua,它只有double作为数字类型,所以我不得不手动处理。我使用的代码与我用于类似的问题16的代码(查找2^1000中数字的总和)几乎相同。但是,这次问题似乎超出了我的算法在合理的时间内解决-在我必须等待超过10秒才能计算出下一个总和之前,它达到了32!,而到34!时,它需要比我等待的时间更长。有没有办法可以加快这个过程(使用“raw”Lua-而不是LuaJIT或任何类似的东西)?
local sum = {1}
for i=1,100 do
local carry = 0
for v=1,#sum do
local c = carry
carry = 0
local t = sum[v] * i
while t >= 10 do
t = t - 10
carry = carry + 1
end
local s = t + c
while s >= 10 do
s = s - 10
carry = carry + 1
end
sum[v] = s
end
if carry > 0 then
sum[#sum+1] = carry
end
print(""..i.."! = "..getCharactersReversed(sum))
end
点赞
用户1751920
试试这段简短的代码:
def factorial(n):
return reduce(lambda x,y: x*y,[_ for _ in range(1,n+1)])
print sum(map(int,list(str(factorial(100)))))
将 100 的阶乘结果转换成字符串,然后将每个数字转化为整数并求和。
2014-06-28 00:44:38
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你的问题在于
(n+1)!的十进制表示长度可能比n!的长度多1以上。这在n == 14时首次出现,因此,在这里,你的最终
carry是13,且前导“数字”大于10。从此以后,这个问题会变得越来越严重,打印#sum和最终的进位将产生如下结果:15 11 13 16 12 20 17 13 35 18 14 64 19 15 121 20 16 243 21 17 510 22 18 1124 23 19 2585 24 20 6204 25 21 15511 26 22 40329 27 23 108888 28 24 304888 29 25 884176 30 26 2652528 31 27 8222838 32 28 26313083将
leading_number * i逐步减去,以使其小于10,需要越来越长的时间。在某个点(大约是45),值变得如此之大,以至于t - 10 == t,你会陷入一个无限循环。LuaJIT对此没有任何帮助。因此,你必须确保你永远不会写出大于9的数字,例如通过在类似于前面数字的循环中减少最终进位并添加所需的任意数量的数字。这样做,程序运行时没有明显的延迟。
if carry > 0 then local w = #sum+1 local cc = 0 while carry > 0 do while carry >= 10 do carry = carry - 10 cc = cc + 1 end sum[w] = carry w = w+1 carry = cc cc = 0 end end但通过除法确定数字和进位要更简洁,并且对于更大的因数也要更有效(将数字乘以100时,结果平均为450,需要45个减法,但两个除法对于所有因数都足够)。