2014-10-03 54 views
1

我對Lua很新穎,我只是通過我的機器人團隊的導師瞭解它。他們挑戰我們在該打印下444我嘗試所有的素數的問題是:Lua - 從1到n計算素數

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,哪裏是我的錯嗎?

回答

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代碼不會縮進。

您可以在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