Lua 素数检测器
这是我的Lua代码,用于获取用户输入,并检查输入的数字是否为素数。我的问题是程序认为任何偶数都不是素数,任何奇数都是素数Lua 素数检测器,lua,numbers,Lua,Numbers,这是我的Lua代码,用于获取用户输入,并检查输入的数字是否为素数。我的问题是程序认为任何偶数都不是素数,任何奇数都是素数 print("Enter a number.") local number = io.read("*n") function prime(n) for i = 2, n^(1/2) do if (n % i) == 0 then return false end return true end end if prime(numbe
print("Enter a number.")
local number = io.read("*n")
function prime(n)
for i = 2, n^(1/2) do
if (n % i) == 0 then
return false
end
return true
end
end
if prime(number) == true then
print("Your number is prime!")
end
if prime(number) == false then
print("Your number is not prime!")
end
你太快就回到了现实。只要任何
i
满足条件,就返回true。必须将返回值放在循环之后。将返回真值
移出循环
因此:
function prime(n)
for i = 2, n^(1/2) do
if (n % i) == 0 then
return false
end
end
return true
end
我会用2除以数字,然后检查除法的下限是否等于除法,以此来检查素数。看起来像这样
if (input/2 == math.floor(input/2)) then
print("is prime")
else
print("is not prime")
end
如果要检查素性,不妨选择一个有效的算法。正如(神秘地)指出的,所有大于2的偶数都不是素数。因此,您可以短路检查一半的数字,这将使检查任何特定数字的速度加倍:
function check_prime (x)
-- Negative numbers, 0 and 1 are not prime.
if x < 2 then
return false
end
-- Primality for even numbers is easy.
if x == 2 then
return 2
end
if x%2 == 0 then
return false
end
-- Since we have already considered the even numbers,
-- see if the odd numbers are factors.
for i = 3, math.sqrt(x), 2 do
if x%i == 0 then
return false
end
end
return x
end
在我的测试中,对于生成所有小于100万的素数,sieve版本比以前的算法快6倍左右。(您的里程数可能会有所不同。)您可以轻松检查所有小于
number
的数字的素数,无需额外付费。另一方面,它使用了更多的内存,如果你真的想只检查一个数字的素数,它的效率就低了。我知道这是一篇老文章,但由于它在谷歌上接近顶端,我想发布我的素数查找器不会有什么坏处。它基本上对明显的东西做一些简单的检查,然后以类似于Jon Ericson文章中第一个例子的方式循环检查剩下的东西。虽然还没有达到基准,但它似乎处理得足够好
--returns true if prime
function isPrime(n)
local n = tonumber(n)
--catch nil, 0, 1, negative and non int numbers
if not n or n<2 or (n % 1 ~=0) then
return false
--catch even number above 2
elseif n>2 and (n % 2 == 0) then
return false
--primes over 5 end in 1,3,7 or 9
--catch numbers that end in 5 or 0 (multiples of 5)
elseif n>5 and (n % 5 ==0) then
return false
--now check for prime
else
--only do the odds
for i = 3, math.sqrt(n), 2 do
--did it divide evenly
if (n % i == 0) then
return false
end
end
--can defeat optimus
return true
end
end
——如果为素数,则返回true
函数isPrime(n)
本地n=吨数(n)
--捕捉零、0、1、负数和非整数
如果不是n或n2和(n%2==0),则
返回错误
--超过5的素数以1、3、7或9结尾
--以5或0结尾的捕获数(5的倍数)
如果n>5且(n%5==0),则
返回错误
--现在检查素数
其他的
--只做赔率
对于i=3,math.sqrt(n),2 do
--它平均分配了吗
如果(n%i==0),则
返回错误
结束
结束
--能打败擎天柱吗
返回真值
结束
结束
顺便说一下,“请阅读我的代码并调试它”通常不是一个好问题。顺便问一下,为什么要调用prime
两次?使用if-then-else
构造。这是一种奇怪的方法来测试一个数字是否为偶数,而不是它是否为素数。检查一个数字是否为偶数的更简单的方法是测试输入%2==0
。模运算符(%
)返回两个数字除后的剩余部分。(当然,奇偶性和素性并不相同。)这个问题是谷歌搜索词“luaprime”(即使个人搜索结果关闭)的第一个结果。也许有一个有效的算法来解答这个问题。(我知道其他算法可能会产生更好的结果。)这是事实。有,但这很容易实现,应该足以处理相对较小的数字。
prime = sieve(number)
if prime[number] then
print("Your number is prime!")
else
print("Your number is not prime!")
end
--returns true if prime
function isPrime(n)
local n = tonumber(n)
--catch nil, 0, 1, negative and non int numbers
if not n or n<2 or (n % 1 ~=0) then
return false
--catch even number above 2
elseif n>2 and (n % 2 == 0) then
return false
--primes over 5 end in 1,3,7 or 9
--catch numbers that end in 5 or 0 (multiples of 5)
elseif n>5 and (n % 5 ==0) then
return false
--now check for prime
else
--only do the odds
for i = 3, math.sqrt(n), 2 do
--did it divide evenly
if (n % i == 0) then
return false
end
end
--can defeat optimus
return true
end
end