4

これは、ユーザー入力を受け取り、入力された数値が素数であるかどうかを確認するための私の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
4

5 に答える 5

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
于 2012-07-20T01:57:51.840 に答える
5

あなたはあまりにも早く真に戻ります。条件が満たされる とすぐにtrueに戻ります。ループのiにリターンを配置する必要があります。

于 2012-07-20T01:56:37.970 に答える
5

私はそれが古い投稿であることを知っています、しかしそれがグーグルのトップに近いので、私は私のプライムファインダーを投稿することは害がないだろうと思いました。それは基本的に明白なもののいくつかの簡単なチェックを行い、次にジョン・エリクソンの投稿の最初の例と同様の方法で残っているものをループします。ベンチマークはしていませんが、十分に対応しているようです。

--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
于 2013-07-29T15:25:30.110 に答える
3

素数性をチェックする場合は、効率的なアルゴリズムを選択することをお勧めします。1つの答えが(不可解に)指摘したように、2より大きいすべての偶数は素数ではありません。したがって、半分の数のチェックを短絡することができます。これにより、特定の数をチェックする速度が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

ふるい機能を使用するには:

prime = sieve(number)
if prime[number] then
   print("Your number is prime!")
else
   print("Your number is not prime!")
end

私のテストでは、ふるいバージョンは、100万未満のすべての素数を生成するための以前のアルゴリズムよりも約6倍高速です。(マイレージは異なる場合があります。)number追加費用なしで、すべての番号の素数性を簡単に確認できます。一方、それはより多くのメモリを使用し、本当に1つの数値の素数性をチェックしたい場合は、効率が低下します。

于 2013-03-03T07:16:51.153 に答える
-3

素数を2で割って、除算のフロアが除算と等しいかどうかを確認します。こんな感じです。

if (input/2 == math.floor(input/2)) then
  print("is prime")
else
  print("is not prime")
end
于 2012-09-13T23:37:50.960 に答える