에라토스테네스의 체는 소수를 구하는 대표적인 알고리즘이며, 자주 쓰지만 쓸 때마다 헷갈려서 정리했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
#define N 3000
int prime[N + 1];
void che() {
prime[0] = -1;
prime[1] = -1;
for (int i = 2; i <= N; i++) prime[i] = i;
int sqrtN = int(sqrt(N));
for (int i = 2; i <= sqrtN; i++) {
if (prime[i] == i) {
for (int j = i * i; j <= N; j += i) {
if (prime[j] == j) prime[j] = i;
}
}
}
}
int main() {
che();
for (int i = 0; i <= N; i++) if (prime[i] == i) cout << prime[i] << '\n';
return 0;
}
|
N은 소수의 범위를 결정한다. 예를 들어, N이 3,000이라면 3,000 이하의 소수를 구한다.
prime[] 배열의 원소는 index와 동일하게 둔다(line 13). 단, 0과 1은 소수가 될 수 없으므로 -1로 둔다.
소수인지 아닌지 판단은 root N까지만 하면 된다.
=> $N=p×q$라고 하자. 이 때 p와 q는 다음과 같은 모양을 띈다.
1. p == root N && q == root N
2. p < root N && q > root N
즉, 둘 중 적어도 하나는 root N보다 작거나 같다. 이 root N보다 작은 수의 배수는 소수가 아니라는 것을 소스코드에서 확인할 수 있다(line 15-17). root N보다 큰 수는 걸러지므로 root N까지만 확인하면 된다.
'자료구조 & 알고리즘' 카테고리의 다른 글
레드블랙 트리(red-black tree) (0) | 2019.05.13 |
---|---|
[std]set, map (0) | 2019.05.10 |
마스터 정리(Master Theorem) (0) | 2019.05.08 |
이진 검색 트리(Binary Search Tree) (0) | 2019.05.06 |
해시 테이블(Hash Table) (0) | 2019.05.05 |