埃氏篩法(篩選素數)

首先,將2到n範圍內的所有整數記下來,其中最小的數字2爲素數。在表中將2的倍數劃去,表中剩下最小的數爲3,不能被更小的整除,然後將3的倍數劃去。

如果表中剩下的最小數爲m,m是素數,然後將表中所有m的倍數都劃去。像這樣反覆的操作,就能依次枚舉n以內的素數了。


複雜度:nloglogn


代碼實現:

#include<iostream>
#include<string.h>
using namespace std;
#define MAX_N 100000
bool is_prime[MAX_N];
int prime[MAX_N];
int num;
int sieve(int n)
{
    num=0;
    for(int i=1;i<=n;i++)
        is_prime[i]=true;
    is_prime[0]=is_prime[1]=false;
    for(int i=2;i<=n;i++){
        if(is_prime[i])
        {
            prime[num++]=i;
            for(int j=2*i;j<=n;j+=i)
                is_prime[j]=false;
        }
    }
    return num;
}
void printf()
{
    for(int i=0;i<num;i++)
    cout<<prime[i]<<" ";
    cout<<endl;
}
int main()
{
    int N;
    while(cin>>N)
    {
        memset(prime,0,sizeof(prime));
        cout<<sieve(N)<<endl;
        printf();
    }
}


發佈了33 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章