循環打印出一個號碼,如果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
代碼不會縮進。
您可以在if
條件下跳過== true
條件: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