我是Lua的新手,我只是通过我的机器人团队的导师学习它。他们挑战我们打印444下的所有素数。我的尝试是:
isPrime = true
for i = 2, math.floor(math.sqrt(444)) do
for n = 2, i-1 do
if i % n == 0 then
isPrime = false
end
end
if isPrime == true then
print(i)
end
end
然而,程序只是吐出2和3.我的错在哪里?
答案 0 :(得分:3)
如果isPrime
为真,则循环打印出一个数字,但当您检查值isPrime
时false
设置为4
,并且没有任何内容将其设置为true试。
您的程序包含要检查的每个数字的外部循环,以及用于检查该数字的内部循环。
内部循环的设计使得素数不会触及isPrime
,对于复合数字,它会将isPrime
设置为false。因此,对于素数,isPrime
的值将是内循环开始之前设置的值。由于您希望isPrime
在素数末尾为true
,因此您应该在内循环之前将isPrime
设置为true。
一旦你这样做,你的程序仍然有一个bug。你的算法对sqrt(n)
确切的问题有点困惑。
其他一些建议:
习惯使用局部变量,而不是全局变量。这有助于避免意外重置您不想要的变量的错误。
local isPrime = true
使用一致的缩进。当有人读取您的代码时,它会有所帮助。在这种情况下,您的if isPrime == true then print(i) end
代码没有足够的缩进。
您可以跳过== true
条件中的if
:if isPrime then print(i) end
。
有一种更好的算法可以找到名为Sieve of Eratosthenes的特定值的所有素数。这是Lua中的一个实现:
function sieve_of_eratosthenes(n)
local is_prime = {}
for i = 1, n do
is_prime[i] = 1 ~= i
end
for i = 2, math.floor(math.sqrt(n)) do
if is_prime[i] then
for j = i*i, n, i do
is_prime[j] = false
end
end
end
return is_prime
end
local primes = sieve_of_eratosthenes(444)
for key, value in pairs(primes) do
if (value) then
print(key)
end
end