에라토스테네스의 체는 그리스의 수학자이자 천문학자이며 지리학자였던 에라토스테네스(B.C. 275 ~ 194)가 고안한, 소수를 찾아내는 방법이다.

에라토스테네스의 체는 임의의 자연수 n에 대하여 그 자연수 이하의 소수를 모두 찾아주는데, 그 과정을 알고리즘으로 나타내면 다음과 같다.


에라토스테네스의 체 알고리즘

1.  1부터 n까지의 자연수를 전부 나열한다.
2. 소수도, 합성수도 아닌 1을 지운다.
3. 남아 있는 자연수 중 가장 작은 수인 2는 소수다. 이제 2의 배수들을 모두 지운다.
4. 남아 있는 자연수 중 가장 작은 수인 3은 소수다. 이제 3의 배수들을 모두 지운다.
5. 남아 있는 자연수 중 가장 작은 수는 소수다. 이 수의 배수들을 모두 지운다.
6. 남은 자연수 중 가장 작은 수가 n의 제곱근을 넘을 때까지 과정 5를 반복하면, 남아 있는 수가 모두 소수다.


#include <iostream>
#include <math.h>
using namespace std;

#define MAX 100

int main()
{
    bool* isPrime = new bool[MAX];
    int squareRoot = (int)sqrt(MAX);

    //Eratosthenes's Sieve
    for (int i = 2; i < MAX; ++i) {
        isPrime[i] = (i & 1) != 0; // Multiples of 2 are false
    }

    isPrime[2] = true;

    for (int i = 3; i < squareRoot; i = i + 2) {
        if (isPrime[i] == false) {
            continue;
        }

        int num = i << 1; //if i is 3, then initial num value is 6

        while (num < MAX) {
            isPrime[num] = false;
            num = num + i;
        }
    }

    //result
    cout << "Prime :";
    for (int i = 2; i < MAX; ++i) {
        if (isPrime[i] == true) {
            cout << " " << i;
        }
    }
    cout << endl;

    delete(isPrime);

    return 0;
}



'SW > 알고리즘' 카테고리의 다른 글

Tree Traversal1 - Preorder Traversal  (0) 2019.02.23
Right Hand Rule  (0) 2018.12.30
Prime Number  (0) 2018.12.24
Asymptotic Analysis  (0) 2018.12.23
Eucild's Algorithm  (0) 2018.12.23

+ Recent posts