🎯
【Java】エラトステネスの篩
問題
- 整数
n
以下のすべての素数を見つけよ。
問題の解き方
素数の倍数は合成数(素数ではない数)だから、最初の素数である2
から始めてn
までの素数の倍数を合成数とし、合成数以外を素数とします。というざっくりとした説明ですが、これをエラトステネスの篩と言います。
コードを記述する上での考え方
- サイズ
n + 1
のboolean
型の配列isPrime
を用意します。(primeは素数という意味です。)
ここでは、true
=素数で、false
=合成数です。 - 配列を一旦全て
true
で初期化します。 -
0
と1
は素数ではないので、isPrime[0]
とisPrime[1]
はfalse
にします。 -
2
からn
までループするfor
文を用意して、 -
false
ならcontinue
によりループを1つ進めます。
if
文の条件式の!isPrime[i]
は、isPrime[i] == false
と同義です。 -
true
なら、n
以下までのi
の倍数をfalse
にします。 - そのすべてのループが終わったら、戻り値として配列
isPrime
を返します。
コード例
import java.util.*;
public class Main {
static boolean[] eratosthenes(int n) {
boolean[] isPrime = new boolean[n + 1];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= n; i++) {
if (!isPrime[i]) {
continue;
}
for (int j = i + i; j <= n; j += i) {
isPrime[j] = false;
}
}
return isPrime;
}
public static void main(String[] args) {
int n = 30;
boolean[] isPrime = eratosthenes(n);
for(int i = 1; i <= n; i++){
if(isPrime[i]){
System.out.println(i + "は素数");
}else{
System.out.println(i + "は素数ではない");
}
}
}
}
Discussion