에라토스테네스의 체(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 |