2016.02.02
数学
素数リスト作成
指定した数値以下の全ての素数を表示するプログラムの解説をします。
Javaソースコード
PrimeNumber2.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
public class PrimeNumber2 { // メイン public static void main( String[] args ) { // 変数の宣言 int number; // 上限値 // 入力した引数が1つ以上かを調べる if ( 1 > args.length ) { // 入力した引数が1つ未満の場合、使用方法を表示する System.out.println( "PrimeNumber2 [上限値]" ); return; } // 引数をint型に変換しnumberに代入 try { number = Integer.parseInt( args[ 0 ] ); } catch( NumberFormatException ne ) { // args[0]が数字ではない System.out.println( "[上限値]の取得に失敗しました" ); return; } // 上限値が1の場合、終了 if ( 1 >= number ) { System.out.println( "表示する素数がありません" ); return; } // 上限値+1のint型配列を宣言 int[] count = new int[ number + 1 ]; // 配列に0を格納 for ( int i = 0; i <= number; ++ i ) count[ i ] = 0; // iで割り切れる配列番号に1を足していく for ( int i = 2; i <= number; ++ i ) { int pos = i; while ( pos <= number ) { ++ count[ pos ]; pos += i; } } // 配列の値が1の番号を表示 for ( int i = 2; i <= number; ++ i ) { if ( 1 == count[ i ] ) System.out.println( i ); } } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis PrimeNumber2.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac PrimeNumber2.java
実行
C:\talavax\javasample>java PrimeNumber2 50
出力結果
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
ここからは、素数のリストを表示するプログラムの説明をします。
001
public class PrimeNumber2 {
クラス名を、PrimeNumber2としています。
002 003
// メイン public static void main( String[] args ) {
このmainメソッドからプログラムを実行します。
004 005
// 変数の宣言 int number; // 上限値
007 008 009 010 011 012
// 入力した引数が1つ以上かを調べる if ( 1 > args.length ) { // 入力した引数が1つ未満の場合、使用方法を表示する System.out.println( "PrimeNumber2 [上限値]" ); return; }
015 016 017 018 019 020 021 022 023 024
// 引数をint型に変換しnumberに代入 try { number = Integer.parseInt( args[ 0 ] ); } catch( NumberFormatException ne ) { // args[0]が数字ではない System.out.println( "[上限値]の取得に失敗しました" ); return; }
026 027 028 029 030
// 上限値が1の場合、終了 if ( 1 >= number ) { System.out.println( "表示する素数がありません" ); return; }
032 033
// 上限値+1のint型配列を宣言 int[] count = new int[ number + 1 ];
035 036
// 配列に0を格納 for ( int i = 0; i <= number; ++ i ) count[ i ] = 0;
全ての配列の値を0にしています。以下の例ではnumber=10です。
038 039 040 041 042 043 044 045
// iで割り切れる配列番号に1を足していく for ( int i = 2; i <= number; ++ i ) { int pos = i; while ( pos <= number ) { ++ count[ pos ]; pos += i; } }
同様に3からnumber=10まで処理を実行すると、配列の値は以下のように変化していきます。
047 048 049 050
// 配列の値が1の番号を表示 for ( int i = 2; i <= number; ++ i ) { if ( 1 == count[ i ] ) System.out.println( i ); }
number=10の場合、表示される素数は、2と3と5と7です。
関連コンテンツ
割り算で「割り切れる」、「割り切れない」ってどういうこと?