728x90
반응형
1. 개요
1. 고대 그리스의 수학자 에라토스테네스가 만들어 낸 소수를 찾는 방법
2. 시간 복잡도 = O(n)
2. 방법
step 1) 숫자 1 ~ 100 쓰기
step 2) 소수도, 합성수도 아닌 유일한 자연수 1을 제거
step 3) 2를 제외한 2의 배수를 제거
step 4) 3을 제외한 3의 배수를 제거
step 5) 4는 뛰어넘고, 5의 배수를 제거
step 6) 위의 방법과 동일하게 제거해나간다.
3. 소스 코드
#include<cstring>
constexpr int MAX=1000001;
bool prime[MAX];
void eratosthenes(){
memset(prime, false, MAX);//배열을 초기화한다.
prime[2]=true;//2는 소수다.
prime[3]=true;//3은 소수다. 이러면 5 이상의 홀수만 판별하면 된다.
// 5 mod 6 과 1 mod 6을 참으로 설정한다. 이들은 2의배수도 아니고 3의 배수도 아닌 숫자집합이다.
// 단, 1은 소수가 아니기에 1 mod 6은 7부터 시작한다.
for(int i=5;i<MAX;i+=6)
prime[i]=true;
for(int i=7;i<MAX;i+=6)
prime[i]=true;
for(int i=5, j=25, flag = 0;j < MAX;){
int addi = 2 * (flag + 1)
if(prime[i]==true){
for(i*=6;j < MAX;j+=i){//i를 2배로 하여 i의 짝수곱을 굳이 검색하지 않게 한다.
prime[j]=false;
}
i/=6;//i 원상복구
j+=addi*i
for(i*=6;j < MAX;j+=i){//i를 2배로 하여 i의 짝수곱을 굳이 검색하지 않게 한다.
prime[j]=false;
}
i/=6;//i 원상복구
}
// 다음 루프 진행을 위한 준비. 현재의 i가 5 mod 6 이면 2를, 1 mod 6 이면 4를 더한다.
i += ;
j=i*i;
flag ^= 1;
}
}
728x90
'알고리즘' 카테고리의 다른 글
[알고리즘] 배낭 문제 (1) | 2024.04.03 |
---|---|
[기타] 주어진 수열에서 선택한 3개의 값의 합이 0에 가장 가깝게 선택하는 방법 (1) | 2023.10.03 |
투 포인터(Two Pointer) 알고리즘 (0) | 2023.10.03 |
[알고리즘] 위상 정렬(Topological Sorting) (1) | 2023.10.02 |
[알고리즘] 분할 정복(Divide and Conquer) (0) | 2022.12.08 |