这是我的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(number) == true then
print("Your number is prime!")
end
if prime(number) == false then
print("Your number is not prime!")
end
答案 0 :(得分:9)
将return true
移出循环。
因此:
function prime(n)
for i = 2, n^(1/2) do
if (n % i) == 0 then
return false
end
end
return true
end
答案 1 :(得分:5)
你过早回归真实。只要任何 i
符合条件,您就会返回true。您必须在循环之后放置返回。
答案 2 :(得分:4)
我知道这是一个老帖子,但由于它在谷歌的顶部附近,我认为发布我的主要发现者不会有什么坏处。它基本上对显而易见的东西进行了一些简单的检查,然后以与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
答案 3 :(得分:2)
如果你要检查素性,你也可以选择一种有效的算法。正如one answer(密码)所指出的,所有大于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
我们可以应用各种各样的优化,但让我们以更加Lua的方式做到这一点:
function sieve (x)
if x < 2 then
return false
end
-- Assume all numbers are prime until proven not-prime.
local prime = {}
prime[1] = false
for i = 2, x do
prime[i] = true
end
-- For each prime we find, mark all multiples as not-prime.
for i = 2, math.sqrt(x) do
if prime[i] then
for j = i*i, x, i do
prime[j] = false
end
end
end
return prime
end
使用sieve功能:
prime = sieve(number)
if prime[number] then
print("Your number is prime!")
else
print("Your number is not prime!")
end
在我的测试中,筛选版本比以前的算法快6倍,以生成不到100万的所有素数。 (您的里程可能会有所不同。)您可以轻松检查所有小于number
的数字的素数,无需额外费用。另一方面,它使用更多的内存,如果你真的想检查一个数字的素数,它的效率就会降低。
答案 4 :(得分:-3)
我会通过将数字除以2来检查素数,并检查除法的底限是否等于除法。它看起来像这样。
if (input/2 == math.floor(input/2)) then
print("is prime")
else
print("is not prime")
end