“for”和/或“if, then”语句出现问题。
2011-7-25 5:38:45
收藏:0
阅读:107
评论:2
这是一个生成质数的看似简单的函数,但它并不像预期的那样工作。我已经搜索了在线指南,但似乎无法理解它。非常感谢您的帮助。
primes = function(limit)
local t = {2}
for i = 3, math.sqrt(limit) do
for k, v in ipairs(t) do
if i % v == 0 then -- check if "i" is evenly divisible by each table element
break
else table.insert(t, i) -- if it is not, it is a prime number
break
end
end
end
return t
end
当我执行:
for k, v in ipairs(primes(15)) do print (k, v) end
我得到的结果为:
1 2
2 3
3 5
4 7
5 9
6 11
7 13
8 15
9和15不是质数,看起来第二个“for”循环没有越过表中的第一个元素(2)。在这种情况下正确使用“for”循环的方法是什么?
谢谢,Vince
编辑:像建议的那样将传递的参数限制为其平方根。
原文链接 https://stackoverflow.com/questions/6811931
点赞
stackoverflow用户596285
你插入的太快了,在插入之前必须完成for循环。下面是一个方法:
primes = function(limit)
local t = {2}
local is_prime, i_rt
for i = 3, limit do
is_prime=true
i_rt=math.sqrt(i)
for k, v in ipairs(t) do
if i % v == 0 then -- 如果可以整除,则不是质数
is_prime=false
break
end
if v > i_rt then -- 为了提高效率,一旦超过i的平方根,就退出
break
end
end
if is_prime then
table.insert(t, i) -- 如果是质数,则插入
end
end
return t
end
以下是示例:
> for k, v in ipairs(primes(50)) do print (k, v) end
1 2
2 3
3 5
4 7
5 11
6 13
7 17
8 19
9 23
10 29
11 31
12 37
13 41
14 43
15 47
2011-07-25 12:32:46
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我认为你只需要颠倒 for 循环的顺序。目前你是对每个数字都进行3、4、5等的测试,然后再对每个数字进行四次测试,然后再对每个数字进行五次测试等等。如果你交换两个“for”语句,你将首先比较 3、4、5...与第一个数字,然后比较 3、4、5...与第二个数字,然后比较 3、4、5...与第三个数字等等。
编辑
事实上,您需要做更多的工作。你必须确保 3、4、5...都不会被这个数字整除,然后在内部 for 循环之后,如果没有其他结果,就插入这个数字。此外,你应该限制内部循环到 sqrt(v) 停止,因为如果没有 sqrt(v) 下的任何数整除 v,那么除了 v 之外,也没有 sqrt(v) 以上的数。
编辑
事实上,我认为我误解了你的代码,你应该忽略我说的话。将内部循环限制为 sqrt(v),但是除此之外,遵循 BMitch 的建议。