Lua素数检查器

这是我 Lua 代码从用户输入中获取,并检查输入的数字是否为质数。我的问题是该程序认为任何偶数都不是质数,而任何奇数都是质数。

print("输入一个数字:")
local number = io.read("*n")

function prime(n)
    for i = 2, n^(1/2) do
        if (n % i) == 0 then
            return false
        end
    end
    return true
end

if prime(number) == true then
    print("您输入的数字是质数!")
end

if prime(number) == false then
    print("您输入的数字不是质数!")
end
点赞
用户298661
用户298661

你太早返回 true 了。只要任何一个 i 满足条件,你就会立即返回 true。你必须将返回语句放在循环之后。

2012-07-20 01:56:37
用户107090
用户107090

return true 移出循环。

因此:

function prime(n)
    for i = 2, n^(1/2) do
        if (n % i) == 0 then
            return false
        end
    end
    return true
end
2012-07-20 01:57:51
用户989394
用户989394

我会通过将数字除以2并检查除法的floor值是否等于除法来检查质数。代码如下。

if (input/2 == math.floor(input/2)) then
  print("is prime")
else
  print("is not prime")
end
2012-09-13 23:37:50
用户1438
用户1438

如果你要检查素数,最好选择一个高效的算法。正如一个回答(神秘地)指出的那样,所有大于2的偶数都不是素数。因此,你可以为一半的数字减少检查,这会使检查任何一个特定数字的速度加倍:

function check_prime (x)

  -- 负数、0和1都不是素数。
  if x < 2 then
     return false
  end

  -- 对于偶数,判断是否为素数很容易。
  if x == 2 then
     return 2
  end
  if x%2 == 0 then
     return false
  end

  -- 因为我们已经考虑了偶数,所以看奇数是否是因子。
  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

  -- 假设所有数字都是素数,除非被证明不是素数。
  local prime = {}
  prime[1] = false
  for i = 2, x do
      prime[i] = true
  end

  -- 对于我们发现的每个素数,将所有倍数标记为不是素数。
  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("你的数字是素数!")
else
   print("你的数字不是素数!")
end

在我的测试中,筛选版本在生成小于100万的所有素数方面比之前的算法快了6倍。(结果可能因人而异)。你可以轻松地检查所有小于number的数字的素性,而不需要额外的花费。另一方面,它会使用更多的内存,如果你真的想检查一个数字的素性,它的效率会降低。

2013-03-03 07:16:51
用户275899
用户275899

我知道这是一篇旧帖子,但既然它在谷歌上靠前,我想发表一下我的素数查找器也无妨。它基本上对明显的东西做了一些简单的检查,然后以类似于 Jon Ericson 在帖子中第一个例子的方式循环处理剩下的部分。我还没有进行基准测试,但它似乎能够很好地处理。

--如果是素数,则返回 true
function isPrime(n)
    local n = tonumber(n)
    --捕获 nil、0、1、负数和非整数
    if not n or n<2 or (n % 1 ~=0) then
        return false
    --捕获大于 2 的偶数
    elseif n>2 and (n % 2 == 0) then
        return false
    --以 1、3、7 或 9 结尾的质数
    --捕获以 5 结尾或为 5 的倍数
    elseif n>5 and (n % 5 ==0) then
        return false
    --现在检查是否为质数
    else
        --只检查奇数
        for i = 3, math.sqrt(n), 2 do
            --是否能整除
            if (n % i == 0) then
                return false
            end
        end
        --可以打败优势
        return true
    end
end
2013-07-29 15:25:30