본문 바로가기
Algorithm

에라토스테네스의 체(Eratosthenes' sieve)

by Ladun 2019. 3. 17.

에라토스테네스의 체(Eratosthenes' sieve)

 

1부터 N사이의 모든 소수와 소수가 아닌 수를 찾는 방법이다.

 

소수는 1과 자기 자신만을 약수로 가지는 수이다.

 

쉽게 말해 소수는 자기 자신과 1로 밖에 못 나누는 수이다.

 

이러한 원리를 이용해 배수를 지우면서 소수가 아닌 수배제해 나가는 방법이다.

 

즉, 

 

1)---

2의 배수인 4, 6, 8, 10, 12..........지움 

3의 배수이면서 지워지지 않은 수인 9, 15, 21.......지움

.

.

.

.

.

.

2)---

이러한 과정을 반복하며 소수가 아닌 수를 지워나간 후

 

마지막까지 지워지지 않은 수인 소수를 찾는 방법이다.

 

-----

 

예를 들어 1 ~ 50 사이의 소수를 찾는 다면,

 

 

1은 소수가 아니므로 먼저 배제하고

 

2의 배수들을 배제한다.

 

 

다음으로, 2의 배수들을 배제하고 남은 수들 중 3의 배수들을 소거해 나간다.

 

 

그 다음으로, 5의 배수

 

 

마지막으로 7의 배수를 소거한다.

 

 

이렇게 되면 1 ~ 50 사이에서 소수는 칠해진 숫자들이다.

 

아래는 위 알고리즘을 이용하여 2 ~ N까지의 소수를 출력하는 코드이다.

------------------------------------------------------------------------------

 

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
27
28
29
30
31
32
33
34
35
#include <stdio.h>
 
#define MAX 10001
 
int N;
int arr[MAX];
 
void Eratosthenes()
{
    arr[1= 1;
 
    for(int i = 2; i <= N;++i)
    {
        if (arr[i])
            continue;
 
        for (int j = i + i; j <= N; j += i)
            arr[j] = 1;
    }
}
 
int main()
{
    scanf("%d"&N);
 
    Eratosthenes();
 
    for (int i = 0; i < N; ++i)
    {
        if (!arr[i])
            printf("%d ", arr[i]);
    }
 
    return 0;
}
cs

 

 

 

 

'Algorithm' 카테고리의 다른 글

Lower Bound & Upper Bound  (0) 2020.04.03
이분 탐색(Binary Search)  (0) 2020.04.03
[정렬] 선택 정렬 (Selection Sort)  (0) 2020.01.20
[정렬] 삽입 정렬 (Insertion Sort)  (0) 2020.01.20
[정렬] 버블 정렬 (Bubble Sort)  (0) 2019.11.21