-1
put "enter a number to determine if it is or is not prime"
get primenum
% for i : 1 .. primenum by 1
% end for
if (primenum / primenum) = 1 or primenum / 1 = 0 then
    put primenum, " is a prime number"
else
    put primenum, " is not a prime number"
end if

出力は 12 が素数であることを示していますが、それが間違っていることはわかって
います。

4

3 に答える 3

6

ええと、私はその言語を知りませんが、かなり読みやすいようです。最初の問題は次の行です。

if (primenum / primenum) = 1 or primenum / 1 = 0 then

これは、1 で割った値が 1 であるか、 1 でprimenum割った値が 0 であるかを確認するためのテストです。最初の条件は常に真であるため、アルゴリズムはすべての整数が素数であると報告します。primenumprimenum

素数の定義を思い出してみましょう。nちょうど 2 つの異なる自然数約数を持つ自然数は素数です。これは、 が素数であるかどうかをチェックして確認するには、およびそれ自体を除いてn他の除数がないことを検証する必要があることを意味します (暗黙のうちに と等しくなることはできないことに注意してください。これを行うには、およびを除外すること自体の除数となる可能性のあるすべての数値を考慮し、それらのいずれかが を除算するかどうかを確認します。これは、これらの数値のいずれかが均等に分割されているかどうかを確認するまでループすることを意味します。~の範囲の自然数n1nn111n1nn2n - 1n2n - 1素数であることを無効にすることができる唯一の可能な数ですn

したがって、数値が素数かどうかのテストを実装する最も単純な方法は次のとおりです。数値を入力として受け入れますnn次に、が より小さいかどうかを確認します2。だとすれば素数にはなりません。次に、からループ2n - 1ます。ループ変数を呼び出しますk。等分( ) にあるものがないかどうかkを確認します。そのような がある場合、素数にすることはできず、ループから抜け出すことができます。それ以外の場合、ループが中断せずに終了する場合は素数です。したがって、疑似コードでは2n - 1nif n mod k = 0knn

integer n
get n
boolean flag
if n < 2
    flag = false
else
    flag = true
    for k = 2 to n - 1
        if n mod k = 0 
            flag = false
            break
if flag
    print "prime"
else
    print "not prime"

さて、あなたのコードについてのちょっとしたコメントです。入力に名前を付けないでくださいprimenumprimenumあなたのコードの読者は、あなたがそのように名前を付けたので、それが実際には素数であると考えるかもしれません. ここでは、次のような名前valueToTestが強く推奨されます。

于 2010-01-26T21:16:43.807 に答える
1

あなたのコードは...あまり意味がありません。

% for i : 1 .. primenum by 1
% end for

うわー。空のループ。書き込みクロック サイクル以外は何もしません。

if (primenum mod primenum) = 0

常になりますtrue

また、あなたは自分の状態を間違った方向に持っています。それが何か (それ自体と 1 以外) で割り切れる場合、それは素数ではありません。

ソリューション?おそらく、まったく理解せずに何かをハックしようとするのではなく、疑似コードで書き直してから、それを実際のコードに変換します。

于 2010-01-26T21:14:04.117 に答える