演習(continue文)の回答例

出典: CourseWiki

continueを使わない版と比べてみてください.

/*
 * エラトステネスの篩 (continue文バージョン)
 */
public class Eratosthenes3 {
    public static void main(String[] args) {
        // 素数だけ true にした配列を得る 
        boolean[] sieve = sieve(1000);
        
        // 素数の表示
        int n = 0;
        for (int i = 2; i < sieve.length; i++) {
            if (!sieve[i]) {
                continue;            // ■i が素数でないならば表示しない■
            }
            System.out.print(i);
            n++;
            if (n % 10 == 0) {
                System.out.println();
            } else {
                System.out.print(" ");
            }
        }
        System.out.println();
    }
    
    /*
     * エラトステネスの篩のアルゴリズムを用いてnまでの素数表を求める.
     * 返り値は n 個の要素を持つ boolean 型の配列.
     * (i (0 <= i < n) が素数ならば配列のi番目の要素が true になっている)
     */
    private static boolean[] sieve(int n) {
        // i が素数なら isprime[i] == true になる配列
        boolean[] isprime = new boolean[n];
 
        // とりあえず,一旦全部素数としてマークする
        for (int i = 0; i < isprime.length; i++) {
            isprime[i] = true;
        }
 
        // 0 と 1 は素数ではない
        isprime[0] = false;
        isprime[1] = false;
        
        // 次の for 文で,p をどこまで動かすか.
        // for (int p = 2; p < n; p++) でも良いが,実際は n の平方根までで構わないので,
        // max に平方根を代入している.Math.sqrt は平方根を求めるメソッド.
        int max = (int)Math.sqrt(isprime.length);
        // 最小の素数2から始めて,配列上で,素数の倍数を false にマークする
        for (int p = 2; p <= max; p++) {
            // System.out.println(java.util.Arrays.toString(isprime));
            if (!isprime[p]) {
                continue;            // ■p が素数でないならば,以下の処理をスキップ■
            }
            // System.out.println("Found Prime Number: " + p);
            // pの倍数を「素数でない」(false) とする
            for (int i = p * 2; i < isprime.length; i += p) {
                // System.out.println("  Marking: " + i);
                isprime[i] = false;
            }
        }
        return isprime;
    }
}
ナビゲーション