본문 바로가기
컴퓨터 관련

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

by _BlankSpace 2017. 4. 15.

소수 구하기 최적 알고리즘.

일반적으로 소수를 구하는 과정. 소수인지 판별할 숫자보다 작은 숫자와 하나 씩 나누는 과정에서 나머지가 없이 나누어진다면, 0과 1을 제외한 모든 숫자가 소수가 된다.

 

따라서 이 방법으로 알고리즘을 짜도 원하는 값을 얻을 수 있다. 하지만 이 방법은 상당한 시간이 걸리기 때문에, 비효율적이다.

이러한 시간 문제를 에라토스테네스의 방법으로 해결할 수 있다. 

[일일히 입력 숫자보다 작은 정수로 나누는 방법을 제외하겠다.]



[에라토스테네스의 체 개념 설명 ] 그림 출처 : https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4


1
2
3
4
5
6
7
8
9
10
11
12
    start=clock();
    for(int i=2; i*i<=b; i++){
        for(int j=a; j<=b; j++){
            if(check[j]==false && i < j){
                if(j % i == 0){
                    check[j] = true;
                }
            } 
        }
    }
    end=clock();
    cout<<"걸린시간 : "<<(double)end-start<<endl;
cs

                             [소스코드 1]




다음 [소스코드1]를 보면 각 숫자의 배수를 지우는 방법을 사용했다.

이미 체크한 숫자는 자동적으로 지나가지만, 여전히 많은 숫자를 확인해야 하므로 시간이 많이 걸린다.

이때, 생각해 볼 점이 있다. 굳이 체크할 배열을 따로 둘 필요가 없다.

시작 입력 숫자에서 끝 입력 숫자를 하나씩 대입하면서, 그 숫자를 i * i <= n 동안 비교한다면 소수인지 알 수 있다.  이 방법이 더 빠르다.



1
2
3
4
5
6
7
8
int prime(int n){
    int i;
    for (i = 2; i * i <= n; i++){
        if (n % i == 0)
            return 0;
    }
    return 1;
}
cs



훨씬 시간이 단축된 것을 확인할 수 있다.

이상으로 에라토스테네스의 체 설명을 마치겠다.

'컴퓨터 관련' 카테고리의 다른 글

RGB 컬러, CYMK 컬러 정리  (0) 2017.04.17
컴퓨터 색상 모델 정리. (Gray, RGB, HSV, YCbCr)  (0) 2017.04.17
[git] stash 정리.  (0) 2017.04.14
[GIT] 강제 pull 받기.  (0) 2017.04.14
GTK+ layout 관리 [4] GtkTable  (0) 2017.04.14

댓글