에라토스테네스의 체 O(N) 코드

[이 글은 이전에 쓰던 블로그에서 작성된 이후 새 블로그로 이전된 글입니다.]

일반적으로 짜는 방법은 O(N lg lg N)인데, 리스트를 사용해 O(N)으로 시간복잡도를 줄인 버전이다.

친구가 짜서 준 소스를 조금 다듬었다.

#include <cstdio>

const int MAX=1000020;

int n, next[MAX], prev[MAX];

int main(){
    int i, j;

    scanf("%d", &n);

    for(i=1; i<n+3; i++){
        next[i] = i+1;
        prev[i] = i-1;
    }

    for(i=2; i*i<=n; i=next[i]){
        for(j=i; i*j<=n; j=next[j]);
        for(j=prev[j]; j!=i; j=prev[j]){
            prev[next[i*j]] = prev[i*j];
            next[prev[i*j]] = next[i*j];
        }
        prev[next[i*i]] = prev[i*i];
        next[prev[i*i]] = next[i*i];
    }

    for(i=2; i<=n; i=next[i])
        printf("%d ", i);
}

댓글 남기기