Java
初心者
素数

Javaで素数判定プログラムを作ってみた

はじめに

本投稿文は初心者が独学でJavaを学び、独創的な発想(少し調べながら)で試行錯誤しながらプログラムを書いていくものであり、どう見ても参考にならないようなコードを自己満足で公開していくものです。

初心者が成長していく姿を温かい目で見守ると同時に、『いや、ここおかしくね(# ゚Д゚)!?』という意見を抱くような箇所も当然あると思いますので、その際は遠慮なくコメントをお願いします。

Qiitaでの投稿について

今回で2回目の投稿となります。先日投稿した文を見返したところQiitaでの記述法をHTML形式だと勘違いしていましたが、Markdown記述法というものがあり、今回はこの方法で書きたいと思います。ご教授くださいました方本当にありがとうございますm(_ _)m
少しでも見やすくなれたら幸いであります。

面接にて記述した素数判定プログラム

(※家に帰ってコンパイルしてみたらエラーが出まくったので修正したのを載せます。)
(※あとRandomクラスを使用していますが、これは最近覚えたのでちょっと使ってみました。)

先日Javaを使用して素数判定プログラムを作ってくださいという問題を出され、ドヤ顔で書いたのが以下のコード。

System.out.println("ランダム素数判定プログラム");
java.util.Random rm = new java.util.Random();
int s = rm.nextInt(100);

if (s == 2 || s == 3) {
    System.out.println(s + "は素数です");
} else if (s % 2 == 0 || s % 3 == 0) {
    System.out.println(s + "は素数ではないです");
} else {
    System.out.println(s + "は素数です");
}

(コードが汚いというツッコミは置いといて)

まず『素数の定義』が分かっていませんでしたね。

(文系なのでこの手の数学の問題は好きではあるのですが、公式などの記憶が宇宙の彼方でして)

Wikipedia先生によれば、

『素数とは、自明な正の約数(1 と自分自身)以外に約数を持たない自然数であり、1 でない数のことである。』

まあ要は

その数字自身と1でしか割り切れない自然数が素数であり、他の数字で割り切れたら素数ではないということだと思います。

例えば、2,3,5,7,11…といった感じで、無限に湧き出るものだそうです。

上記のプログラムを少しだけ解説しますと、まあエラーは出ずにコンパイルできますが、素数ではない数字まで素数という判定がされてしまうものでした。

nが2で割り切れたら偶数で、3で割り切れたらnは奇数であるという考えからこういったプログラムが出来上がっています。

しかし、例えば121は11の二乗なので素数ではありませんが、2や3で割り切れないので、素数という判定が出てしまいます。

(高校1年生からやり直しのレベルで少しだけ恥ずかしいですね。)

素数判定プログラム

System.out.println("素数判定プログラム");
int v = 123;
System.out.println("入力された数字は『" + v + "』です");

if (v < 2) {
    System.out.println("2より小さい数字が入力されました");
} else if (v == 2) {
    System.out.println(v + "は素数です");
} else {
    boolean issosu = true;
    for (int u = 2; u < v; u++) {
        if (v % u == 0) {
            is = false;
        }
    }

    if (isSosu) {
        System.out.println(v + "は素数です");
    } else {
        System.out.println(v + "は素数ではないです");
    }
}

(コードが汚いというツッコミは置いといて)

おそれくこれで正しく素数が判定されるとは思いますが、完成するのに2日かかりました。
弟と素数とはどういう数字か話しあい、2で割り切れたら偶数で、それ以外の数字からまたある数字の二乗でない自然数が素数というような感じで紆余曲折しながらプログラムを考えていましたが、多少ネット検索に頼りながらも出た回答がこちら

自然数n未満の数字で割り切れないnは素数

これに加えて

nが2であれば素数、nが2より小さいならエラー

というようにnをあらかじめ2より大きい数字に限定したうえで、『n>vで割り切れない数字』あるいは『n>=n-1で割り切れない数字』が素数という判定するプログラムを組むことで完成しました。

しかし単純にfor文を使うとどうしても

5は素数ではありません
5は素数ではありません
5は素数です
5は素数ではありません
5は素数ではありません



みたいな感じでなんかfor文で表出された数字で5(入力した数字)を素数かどうか判定していくようになってしまい、悪戦苦闘しました。

まあ解決方法がわからず、ちょっとググってしまいまいしたが、boolean型で変数isSosuを定義し、初期値をtrueにしておきました。そして、for文でuがvよりも1小さい数字の間でループしてもらい、仮にu%v==0であれば、uが自分自身の数字よりも小さい自然数で割り切れたことになるので、isSosuにfalseを代入していく。こうしたことで、割り切れた場合はfalseで、それ以外の場合をまた検討していくことができ、if(isSosu){・・・ でtrueの場合をSystem.out.printlnすることができるようにしました。(ん~これはなんか分かりづらい。)

boolean型を使用することに着目できず、ググってしまったことによって完璧に自力で作れなかったのが悔いではありましたが、初心者が入門書程度の知識で素数判定プログラムを組むとしたら、このようになるんじゃないかなあとは思いますが、おそらくもっといい効率的な書き方があるとは思います。僕も数学が得意ではないですし、Javaのプログラムもまだあまり組んでいません。

だから、とりあえず、プログラムが組めるかどうかをテストされたときの証拠として、この素数判定プログラムが書けるということが一つの関門になるとは思います。初心者の人でプログラムを作成していくのに、いくつか問題を解くと思いますが、その中のこれの一つの解答がこういうのがあるんだなあ見たいな感じでさらっと読んでいただければと思います。