Lua Prime数字检查器

时间:2012-07-20 01:45:50

标签: lua numbers

这是我的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

5 个答案:

答案 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