- ベストアンサー
JAVAで素数判定
JAVAの勉強をしてます 練習問題で、素数判定のプログラムをしているのですが。 1~14までの判定はうまくいきますが、15の判定の時に素数であると表示されて困ってます。どなたかわかりませんか? //読み込んだ数字 n が 15 の場合 if(n == 1) System.out.println("素数ではありません。"); if(n == 2) System.out.println("素数です。"); for (int i = 2; i < n; i++) { if (n % i == 0) { System.out.println("素数ではありません。"); break; } else { System.out.println("素数です。"); break; } } --結果---------------------------------------------- 素数です
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
簡単に直すには、判定と出力のロジックを分ければよいのです。 for分のところだけ boolean issosu = true; for (int i=2; i<n ; i++) { if (n % i == 0) { issosu = false; break; } } if (issosu) { System.out.println("素数です。"); } else { System.out.println("素数ではありません。"); }
その他の回答 (3)
- ushioni
- ベストアンサー率24% (14/58)
if文の中が真だろうが偽だろうがbreakに行っちゃいますね。 for文が全てのiについて余りが0でなかったら"素数です"と表示するように直せば良さそうですね。
補足
ご回答ありがとうございます。 違いがわかりました、素数でないときにのみbreakで抜けれるようにしましたが、 結果だけを表示するにはどのようにしたらいいでしょうか。 if(n == 1) System.out.println("素数ではありません。"); if(n == 2) System.out.println("素数です。"); for (int i = 2; i < n; i++) { if (n % i == 0) { System.out.println("素数ではありません。"); break; } else { System.out.print(""); } } System.out.println("素数です。");
繰り返しのiで割ったあまりが0なら素数ではない、というのは正しい。が、逆に「あまりが0でなければ素数」ではない。 「すべての繰り返しで、あまりが0でない」場合が、素数だ。違いがわかるだろうか?
補足
ご回答ありがとうございます。 違いがわかりました、以下のように変更してみましたが、素数でないときはすぐにbreakで抜けれますが、 結果だけを表示するにはどのようにしたらいいでしょうか。 if(n == 1) System.out.println("素数ではありません。"); if(n == 2) System.out.println("素数です。"); for (int i = 2; i < n; i++) { if (n % i == 0) { System.out.println("素数ではありません。"); break; } else { System.out.print(""); } } System.out.println("素数です。");
このプログラムは、「9」の時も「素数です」と表示しませんか? (っていうか、3以上の奇数の時必ず「素数です」と表示しませんか?) for文の中のif文で真の時も偽の時もbreak文が付いているから、一回しか実行されない。つまり、2で割り切れるかどうかしか判定していない。 ちがってたら、ごめんね~!
お礼
ご回答ありがとうございます。 2で割り切れるかどうかしか判定していませんでした。 ループする前にbreakで抜けてようです。
お礼
ご回答ありがとうございます。 boolean型の変数まだ使ったことがなかったので、その方法は思いつきませんでした。 無事解決しました。