Lua - 计算从1到n的Primes

时间:2014-10-03 00:47:06

标签: lua primes

我是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.我的错在哪里?

1 个答案:

答案 0 :(得分:3)

如果isPrime为真,则循环打印出一个数字,但当您检查值isPrimefalse设置为4,并且没有任何内容将其设置为true试。


您的程序包含要检查的每个数字的外部循环,以及用于检查该数字的内部循环。

内部循环的设计使得素数不会触及isPrime,对于复合数字,它会将isPrime设置为false。因此,对于素数,isPrime的值将是内循环开始之前设置的值。由于您希望isPrime在素数末尾为true,因此您应该在内循环之前将isPrime设置为true。

一旦你这样做,你的程序仍然有一个bug。你的算法对sqrt(n)确切的问题有点困惑。

其他一些建议:

习惯使用局部变量,而不是全局变量。这有助于避免意外重置您不想要的变量的错误。

local isPrime = true

使用一致的缩进。当有人读取您的代码时,它会有所帮助。在这种情况下,您的if isPrime == true then print(i) end代码没有足够的缩进。

您可以跳过== true条件中的ifif 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