ここでは入力された任意の数値を素数であるかどうか判定するプログラムを作っていきます。
プログラムの構成
今回のプログラムの構成は次の様になります。
・素数か判定する
・判定結果を表示する
今回は上の3つの要素別+メインの4つのメソッドを使います。
メソッドの使い方が分からない方はメソッドの使い方の記事をご覧ください。
それでは各要素別に見ていきたいと思います。
メソッド別の解説
数値を入力させる
ここはキーボード入力をさせる方法で紹介した方法を使っていきます。
ソースコード
static int 入力()throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("判定したい数値を半角で入力してください");
return Integer.parseInt(br.readLine());
}
このようにすることで数値を入力させることが出来ます。
もし、この方法が分からないのであればキーボード入力をさせる方法の記事をご覧ください。
素数かどうか判定する
ここは繰り返しの処理while文と条件分岐のif文を使います。 http://mittsu2017.com/2017/07/15/post-51/ http://mittsu2017.com/2017/07/13/post-22/素数とは?
判定の前に素数とはなにか言うと、
・2以上の数値
・1とその数字そのものでしか割り切れない
この3つの条件を満たす数値のことです。
素数判定の条件式
一つずつ条件式を書いていきましょう。
まず、入力された数値が正の数値であるかは
if(num<0) return false;
で判定することが出来ます。
この場合、変数numが0未満、つまり負の数の時falseを返すというものです。
次に、2以上の数値かどうかですが、これも簡単で、
if(num<2) return false;
で判定することが出来ます。
これは変数numが2未満の時falseを返すものです。
ここで、上の2つのIF文を見ていただくと、条件の範囲がかぶっていることに気づくと思います。
無駄を省くために2つの条件式を1つにまとめると
if(num<2) return false;
となります。
最後に、1とその数字そのものでしか割り切れないという条件を見ていきます。
これはどういうことかというと、例えば11は1と11でしか割り切れないので素数、
8は1と2と4と8で割り切れるため素数ではないということです。
これをwhile文とif文を組み合わせて調べていきます。
考え方
・初めて割り切れた数値が1だったら素数と判定しtrueを返す。
・1以外の数値で割り切れたら素数ではないと判定しfalseを返す。
この考え方で作ると次の様になります。
int i=num-1;
while (i>1) {
if (num%i==0) return false;
i--;
}return true;
変数iの値が1になる前に他の数値で割り切れたときはfalseを返す。
1になったときはtrueを返すようにしています。
while文、IF文が分からない方はこちらの記事をご覧ください。
http://mittsu2017.com/2017/07/15/post-51/
http://mittsu2017.com/2017/07/13/post-22/
上で作ったif文とこのwhile文を合わせて、判定のメソッドを作ります。
ソースコード
static boolean 判定(int num) {
if(num<2) return false;
int i=num-1;
while (i>1) {
if (num%i==0) return false;
i--;
}return true;
}
スポンサーリンク
判定結果を表示する
ここは2番で判定した結果を使って素数かどうかの結果を表示します。
ソースコード
static void 出力(boolean 判定,int num) {
if(判定==false) {
System.out.println(num+"は素数ではありません");
}
if(判定==true) {
System.out.println(num+"は素数です");
}
}
メインメソッドについて
最後にメインメソッドを使って上の3つのメソッドを起動していきます。ソースコード
public static void main(String[] args) throws IOException{
int num=入力();
boolean 判定=判定(num);
出力(判定,num);
}
入力と判定のメソッドは結果を他のメソッドで使うため、変数に結果を代入します。
出力メソッドはその結果を他のメソッドで使うことはないため、呼び出しだけ行っています。
完成形
最後に全体をまとめると次の様になります。
ソースコード
import java.io.*;
public class 素数判定 {
public static void main(String[] args) throws IOException{
int num=入力();
boolean 判定=判定(num);
出力(判定,num);
}
static void 出力(boolean 判定,int num) {
if(判定==false) {
System.out.println(num+"は素数ではありません");
}
if(判定==true) {
System.out.println(num+"は素数です");
}
}
static int 入力()throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("判定したい数値を半角で入力してください");
return Integer.parseInt(br.readLine());
}
static boolean 判定(int num) {
if(num<2) return false;
int i=num-1;
while (i>1) {
if (num%i==0) return false;
i--;
}return true;
}
}
実行結果
判定したい数値を半角で入力してください
10
10は素数ではありません
判定したい数値を半角で入力してください
11
11は素数です
判定したい数値を半角で入力してください
1
1は素数ではありません
判定したい数値を半角で入力してください
-1
-1は素数ではありません