2023.01.03

数学

N番目の素数

指定した個数の素数コンソール出力するJavaソースコードを紹介しています。1番目の素数である2から順番に出力されます。

以下の表は、1から10番目の素数を出力した例です。

順番 素数
1 2
2 3
3 5
4 7
5 11
6 13
7 17
8 19
9 23
10 29

Javaのソースコード

PrimeNumber3.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
public class PrimeNumber3 {
	// 素数判定メソッド
	private static boolean isPrimeNumber( int num )
	{
		// 1以下は素数ではない
		if ( 1 >= num ) return false;

		// 2の場合は素数
		if ( 2 == num ) return true;

		// 素数判定
		int n = (int)Math.sqrt( num );
		for ( int i = 2; i <= n; ++ i ) {
			// 余り0で割り切れるかを判定
			if ( 0 == ( num % i ) ) return false;
		}

		// numが2~nで割り切れなかったので素数
		return true;
	}


	// メイン
	public static void main( String[] args ) {
		// 変数の宣言
		int outputnumber;	// 出力する素数の個数

		// 入力した引数が1つ以上かを調べる
		if ( 1 > args.length ) {
			// 入力した引数が1つ未満の場合、使用方法を表示する
			System.out.println( "PrimeNumber3 [出力する素数の個数]" );
			return;
		}

		// 引数をint型に変換しoutputnumberに代入
		try {
			outputnumber = Integer.parseInt( args[ 0 ] );
		}
		catch( NumberFormatException ne )
		{
			// args[0]が数字ではない
			System.out.println( "[出力する素数の個数]の取得に失敗しました" );
			return;
		}

		// 素数の表を作成
		int no = 0;	// 出力した素数の個数
		for ( int number = 1; ; number++ ) {
			// 素数かどうかを判定
			if ( isPrimeNumber( number ) ) {
				// 出力した素数の個数に1を足す
				no++;

				// no番目の素数をコンソール出力
				System.out.println( no + " " + number );

				// 出力した素数の数noがoutputnumber以上でループを抜ける
				if ( no >= outputnumber ) break;
			}
		}
	}
}

実行結果

実行

java PrimeNumber3 50

1番目の引数は「出力する素数の個数」です。この実行例では50を渡しています。

出力結果

1 2
2 3
3 5
4 7
5 11
6 13
7 17
8 19
9 23
10 29
11 31
12 37
13 41
14 43
15 47
16 53
17 59
18 61
19 67
20 71
21 73
22 79
23 83
24 89
25 97
26 101
27 103
28 107
29 109
30 113
31 127
32 131
33 137
34 139
35 149
36 151
37 157
38 163
39 167
40 173
41 179
42 181
43 191
44 193
45 197
46 199
47 211
48 223
49 227
50 229

指定引数の50個の素数が出力されます。

Javaソースコードの解説

001
public class PrimeNumber3 {

クラス名を、PrimeNumber3としています。

003
	private static boolean isPrimeNumber( int num )

int型変数numが素数であればtrue素数でなければfalseを返すisPrimeNumberメソッドを作成しています。

005
006
		// 1以下は素数ではない
		if ( 1 >= num ) return false;

numが1以下の場合、素数ではないのでfalseを返しています。

008
009
		// 2の場合は素数
		if ( 2 == num ) return true;

numが2の場合、素数なのでtrueを返しています。

011
012
013
014
015
016
		// 素数判定
		int n = (int)Math.sqrt( num );
		for ( int i = 2; i <= n; ++ i ) {
			// 余り0で割り切れるかを判定
			if ( 0 == ( num % i ) ) return false;
		}

numを2~nまでの整数で順番に割っていき、割り切れたら素数ではないのでfalseを返しています。ここで、n=(int)√numはnumの平方根の小数点以下を切り捨てた整数値です。

018
019
		// numが2~nで割り切れなかったので素数
		return true;

numを2~nまでの整数で順番に割っていき、割り切れなかったら素数なのでtrueを返しています。

023
024
	// メイン
	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

025
026
		// 変数の宣言
		int outputnumber;	// 出力する素数の個数

出力する素数の数を格納するint型変数outputnumberを宣言しています。

028
029
030
031
032
033
		// 入力した引数が1つ以上かを調べる
		if ( 1 > args.length ) {
			// 入力した引数が1つ未満の場合、使用方法を表示する
			System.out.println( "PrimeNumber3 [出力する素数の個数]" );
			return;
		}

引数の数が1未満の場合、使用方法をコンソール出力してプログラムを終了します。

035
036
037
038
039
040
041
042
043
044
		// 引数をint型に変換しoutputnumberに代入
		try {
			outputnumber = Integer.parseInt( args[ 0 ] );
		}
		catch( NumberFormatException ne )
		{
			// args[0]が数字ではない
			System.out.println( "[出力する素数の個数]の取得に失敗しました" );
			return;
		}

文字型の引数int型に変換して変数outputnumberに代入しています。引数整数でない場合、エラーメッセージをコンソール出力してプログラムを終了します。

046
047
		// 素数の表を作成
		int no = 0;	// 出力した素数の個数

ここから素数の表を作成するソースコードです。

出力した素数の数を格納する整数型の変数noを宣言し、0を代入しています。

048
		for ( int number = 1; ; number++ ) {

整数型の変数numberを1から順番に1ずつ増やす無限ループfor文で作成しています。継続条件式を記述していないので無限ループになります。

049
050
			// 素数かどうかを判定
			if ( isPrimeNumber( number ) ) {

変数numberが素数かどうかをisPrimeNumberメソッドで判定しています。

051
				// 出力した素数の個数に1を足す

出力した素数の数を格納する変数noに1を足しています。

054
055
				// no番目の素数をコンソール出力
				System.out.println( no + " " + number );

変数noと変数numberを半角スペースで区切ってコンソール出力しています、

057
058
				// 出力した素数の数noがoutputnumber以上でループを抜ける
				if ( no >= outputnumber ) break;

出力した素数の数を格納する変数noが、出力する素数の数を格納する変数outputnumber以上になった場合、break文for文を抜けます。

関連コンテンツ

素数を判定するプログラムを作成してみませんか?興味のある方は、ご覧ください。

2016.02.01

配列を使って素数を判定するプログラムを紹介しています。是非、ご覧ください。

2016.02.02

整数型の変数に1を足すインクリメント、1つ引くデクリメントについて詳しく説明しています。

2020.03.23

広告