-
에라토스테네스의 체알고리즘 이론/알고리즘 구현 2019. 8. 15. 18:55
에라토스테네스의 체
에라토스테네스의 체는 소수 관련 문제를 풀 때 가장 자주 사용되는 방법입니다.
소수란 '양의 약수를 두개만 가지는 자연수' 를 의미합니다. 이러한 소수를 대량으로 빠른 시간 내에 구하는 방법이 에라토스 테네스의 체 입니다.
-지워지지 않는 수를 찾을때는 루트 n까지만 찾습니다. 소수 판정 알고리즘과 동일한 최적화.
- 배수들을 지울 때 i*i에서 시작합니다. 2*i는 이미 2의 배수를 지워졌을때 지워 졌을것 3*i도 마찬가지
코드 ( C++ )
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int n;
// 소수인지 아닌지
// IsPrime[i] = i 가 소수인가?
bool IsPrime[101];
void eratosthenes() {
// 1로 IsPrime 배열 초기화
memset(IsPrime, 1, sizeof(IsPrime));
// 루트 n 까지만 계산
int sqrtn = int(sqrt(n));
// 0과 1은 예외 처리
IsPrime[0] = IsPrime[1] = false;
for (int i = 2; i <= sqrtn; ++i)
// 이 수가 아직 지워지지 않았다면
if (IsPrime[i])
//i의 배수 j들에 대하여 isPrime[j] = false 로 둔다.
// i * i 미만의 배수는 이미 지워졌으므로 신경 쓰지 않는다.
for (int j = i * i; j <= n; j += i)
IsPrime[j] = false;
}
int main()
{
cin >> n;
// 2~ 100까지 소수 판별 해보기
// 소수를 판별하는 IsPrime배열이 갱신된다.
eratosthenes();
for (int i = 2; i <= 100; ++i)
{
if (IsPrime[i])
cout << i << "는 소수입니다." << "\n";
else
cout << i << "는 소수가 아닙니다." << "\n";
}
return 0;
}
참고문헌 : 알고리즘 해결 전략
'알고리즘 이론 > 알고리즘 구현' 카테고리의 다른 글
오일러 서킷을 찾아내는 알고리즘 (0) 2019.08.28 그래프의 깊이 우선 탐색 (0) 2019.08.25 크루스칼의 최소 스패닝 트리 알고리즘 (0) 2019.08.23 플로이드 알고리즘 (0) 2019.08.18 다익스트라 알고리즘 (0) 2019.08.11