Skip to content

Instantly share code, notes, and snippets.

@hiroism007
Created April 20, 2013 09:09
Show Gist options
  • Save hiroism007/5425334 to your computer and use it in GitHub Desktop.
Save hiroism007/5425334 to your computer and use it in GitHub Desktop.
エラトステネスのふるい
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;
}
}
@aibou
Copy link

aibou commented Apr 20, 2013

お疲れ様です.

全体の流れはほぼ完璧だと思いますが,いくつか怪しいのでぜひ検討してください.

設計上怪しいところ

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文みれば大体理解できます

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment