반응형
- 대량의 범위 안에서 소수들을 판별할때 사용
- 체를 쳐내듯이 합성수를 하나하나 지워나가며 소수만을 골라냄
/*
The Sieve of Erathosthenes
에라토스테네스의 체
대량의 소수를 한꺼번에 판별할 수 있는 알고리즘
*/
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
int number = 100000; //범위
int a[100001]; //수들을 넣을 배열
// 간단한 소수 판별 알고리즘
bool isPrimeNumber(int _x)
{
int end = (int)sqrt(_x);
for (int i = 2; i <= end; i++)
{
if (_x % i == 0)
{
return false;
}
}
return true;
}
//에라토스테네스의 체
void primeNumberSieve()
{
//초기화, 배열을 2부터 시작해서 정해진 범위까지 채워넣기
for (int i = 2; i <= number; i++)
{
a[i] = i;
}
//합성수들을 지우기, 합성수 : 1과 자기자신 이외의 약수의 개수가 3개 이상인 자연수
for (int i = 2; i <= number; i++)
{
if (a[i] == 0) //이미 지워진 수는 제외
{
continue;
}
for (int j = i + i; j <= number; j += i)
{
a[j] = 0; // 합성수들을 지우기
}
}
for (int i = 2; i <= number; i++)
{
if (a[i] != 0) //지워진 수들을 제외하고 출력, 소수들을 출력
{
printf("%d ", a[i]);
}
}
}
int main()
{
//printf("%d", isPrimeNumber(97));
primeNumberSieve();
return 0;
}
위의 코드에서 합성수들을 지우는 과정을 살펴보면
i와 j가 일정한 규칙으로 초기화가 되는데 아래와 같다
i == 2, j == 4
i == 2, j == 6
i == 2, j == 8
i == 2, j == 10
i == 2, j == 12
i == 2, j == 14
i == 2, j == 16
i == 2, j == 18
i == 3, j == 6
i == 3, j == 9
i == 3, j == 12
i == 3, j == 15
i == 3, j == 18
i == 3, j == 21
i == 3, j == 24
i == 3, j == 27
...
위처럼 2의 배수, 3의 배수 등등 어떤 소수의 배수들로 j가 초기화 되고, 그런 j들을 배열에서 지워준다
그렇게 배열에 소수만 남게 된다
반응형
'자료구조&알고리즘' 카테고리의 다른 글
LeetCode 알고리즘 문제 풀기, validate-ip-address (0) | 2020.06.19 |
---|---|
플로이드 와샬(Floyd Warshall) 알고리즘 (0) | 2020.06.08 |
Priority Queue(우선 순위 큐), Heap(Max Heap, Min Heap) (0) | 2020.04.12 |
Tree (0) | 2020.04.09 |
다익스트라(Dijkstra) 알고리즘 _ 지하철 노선도 경로 찾기 코드 (2) | 2020.04.05 |