Created
April 20, 2013 09:09
-
-
Save hiroism007/5425334 to your computer and use it in GitHub Desktop.
エラトステネスのふるい
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.util.Arrays; | |
import java.util.ArrayList; | |
/** | |
* Created with IntelliJ IDEA. | |
* User: 橘博之 | |
* Date: 4/20/13 | |
* Time: 4:37 PM | |
*/ | |
public class Eratosthenes { | |
public static void main(String[] args) throws IOException { | |
System.out.println("素数を列挙します、数値を入力してください"); | |
//初期化の処理 | |
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); | |
String str = null; | |
//例外処理 | |
try { | |
str = reader.readLine(); | |
} catch (IllegalArgumentException e) { | |
e.printStackTrace(); | |
} | |
//入力から数値にパースする処理 | |
int maxNum = Integer.parseInt(str); | |
//boolean配列を作成し、すべてをTRUEに変換する処理 | |
boolean[]primes = new boolean[maxNum]; | |
Arrays.fill(primes,true); | |
//素数を求めるメソッド | |
calculateNumbers(primes); | |
//素数リストを作成 | |
ArrayList<Integer>primeNumbers = Eratosthenes(primes); | |
//素数リストを表示 | |
for(int i :primeNumbers) System.out.print(i + " "); | |
} | |
public static void calculateNumbers(boolean[] primes) { | |
for (int i = 2; i < primes.length; i++){ | |
if(primes[i]){ | |
for (int j = i+i; j<primes.length;j+=i ){ | |
primes[j] =false; | |
} | |
} | |
} | |
} | |
public static ArrayList<Integer> Eratosthenes(boolean[] primes){ | |
ArrayList<Integer>numbers = new ArrayList<Integer>(); | |
for (int i = 2; i < primes.length; i ++){ | |
if(primes[i]) numbers.add(i); | |
} | |
return numbers; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
お疲れ様です.
全体の流れはほぼ完璧だと思いますが,いくつか怪しいのでぜひ検討してください.
設計上怪しいところ
54行目以降 コンストラクタ?
Eratosthenesクラスがオブジェクトを生成するというのは,ちょっと腑に落ちない.
そもそも,コンストラクタは値を返すのは自分自身の型であって,使用用途として間違っているかもしれません.
これが
convertPrimesListFromArray(boolean[] primes)
メソッドとかなら,何をやるか名前を見て一発で理解できます.命名規則的に変えたほうがいいところ
44行目
calculateNumbers(boolean[] primes)
は,"素数(primes)を使って何を計算するのか不明"なので,変えていきましょう.calculatePrimes(boolean[] primes)
や,generatePrimesArray(boolean[] primes)
などに変更するといいと思います.ちなみに自分なら
public static List<Integer> getPrimes(int num)
で実装すると思います.要らないコメント行
27行目
見たらわかりますw
30行目
同じく.
34行目
同じく.書く場所はこの行ではなく,メソッドを宣言している44行目頭にJavadocで記述するほうが,ドキュメント生成もできて便利です.
40行目
同じく,変数名とfor文みれば大体理解できます