소수를 구할 때 가장 빠른 시간에 구할 수 있는 에라토스테네스의 체의 방법을 알아보자
환경 및 선수조건
- C++
에라토스테네스의 체
2부터 n까지의 소수를 구할 때 에라토스테네스의 체를 이용한 방법은 아래와 같다.
- 2부터 시작해서 n까지 진행한다.
- 가장 작은 수를 선택한다.
- 그 작은 수를 소수라고 가정하고 작은 수부터 n까지 그 작은 수의 배수를 모두 제거한다.
- 시간복잡도:
O(n*log(log(n)))
코드
- count: 저장된 소수의 개수
- c[n+1]: 2 ~ n까지 수에서 제거된 숫자를 체크하는 배열, true(제거됨), false(제거되지않음)
- p[n]: 소수를 저장하는 배열
example.cpp
bool c[1000001]= {false,};
int p[1000000];
int count = 0;
//0~1000000까지 소수 구하기
for(int i=2; i<=1000000; i++){
if(c[i] == false){
// 추가
p[count++] = i;
// i의 배수 지우기
for(int j=i+i; j<=1000000; j+=i){
c[j]=true;
}
}
}