埃氏筛法(筛选素数)

来源:互联网 发布:邮箱大师mac版本下载 编辑:程序博客网 时间:2024/05/02 02:54

首先,将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();
    }
}


0 0
原创粉丝点击