소수를 구하는 여러 알고리즘들이 있지만 그중에서 자주 사용되는 것은

에라토스테네스의 체이다.

 

한번 틀을 짜놓고 외우면 이후에 쉽게 사용 가능하다.

 

 

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>
using namespace std;
 
vector<bool> sieve;
 
void era(int n) {
    sieve.resize(n + 1true);
    sieve[0= sieve[1= false;
    for (int i = 2; i * i <= n; ++i)
        if (sieve[i])
            for (int j = i * 2; j <= n; j += i)
                sieve[j] = false;
}
 
int main() {
    int n;
 
    cin >> n;
    era(n);
 
    for (int i = 2; i <= n; ++i)
        if (sieve[i]) cout << i << '\n';
 
    return 0;
}
cs

 

그 외에도 비트마스크를 이용해서 소수를 구하면 메모리를 무려 1/8이나 절감시킬 수 있다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const int MAX = 1e6;
unsigned char sieve[(MAX + 7/ 8 + 1];
 
bool isPrime(int k) {
    return sieve[k >> 3& (1 << (k & 7));
}
 
void setComposite(int k) {
    sieve[k >> 3&= ~(1 << (k & 7));
}
 
void era() {
    fill(sieve, sieve + (MAX + 7/ 8255);
    setComposite(0);
    setComposite(1);
 
    for (int i = 0; i * i <= MAX; ++i)
        if (isPrime(i))
            for (int j = i * 2; j <= MAX; j += i)
                setComposite(j);
}
cs

 

이런 식으로 전처리해주고 사용하면 된다.

'Algorithm' 카테고리의 다른 글

플로이드 - 와샬 알고리즘  (0) 2020.10.19
벨만 - 포드 알고리즘  (0) 2020.10.18
유니온 파인드(Union-Find)  (0) 2020.10.15
순열과 조합  (0) 2020.10.02
다익스트라 알고리즘  (0) 2020.09.24

+ Recent posts