소수가 되는 수의 배수를 지우면 남은 건 소수가 된다.
소수가 무엇인지를 찾을 필요가 없으며 2부터 자기 자신을 제외한 배수가 되는 것을 지우면 됩니다.
public class Solution {
// 예제와 같이 120까지의 소수를 구하기 위해 120 선언.
static boolean prime[] = new boolean[4000001];
static ArrayList<Integer> prime_numbers = new ArrayList<>();
public static void main(String[] args) throws Exception{
// 구하고자 하는 숫자 범위
int N = 4000000;
// 소수는 false
// 1은 소수가 아니므로 제외
prime[0] = prime[1] = true;
// 제곱근까지 하는 이유 : 제곱근보다 큰 숫자의 배수 중 아직 체크가 안된 수는 N보다 크게 될 수 밖에 없다.
for(int i=2; i*i<=N; i++){
// prime[i]가 소수라면
if(!prime[i]){
// prime[j] 소수가 아닌 표시
// i*i 인 이유 : i*1, i*2, ..., i*(i-1)는 이미 이전 루프문에서 검사했다.
for(int j=i*i; j<=N; j+=i) prime[j]=true;
}
}
// 소수 출력
for(int i=1; i<=N;i++){
if(!prime[i]) prime_numbers.add(i);
}
// 4000000까지 소수 개수
System.out.println(prime_numbers.size());
// 소수 확인
for(int i=1; i<=10; i++) {
System.out.println(prime_numbers.get(i));
}
}
}