Loading

素数筛

题意:筛选出1~n的所有素数

普通筛法

基本思想:素数的倍数一定不是素数
时间复杂度:O(N*loglogN)
不足:一个合数可能被筛选多次,如6可被2和3筛选出来。

void Prime ()
{
    memset(check,0,sizeof(check));//用来标记是否是合数
    for(int i=2; i <= N; i++)
        if(check[i]==0){
            prime[ct++]=i;//存储素数
        for(int j=i+i;j<=n;j+=i)
            check[j]=1;
    }
}

线性筛(欧拉筛法)

时间复杂度:O(N)
原理:保证每个合数只被它最小的那个质因子筛选。i如果能整除prime[j],则i肯定是合数,i中有质因子小于或者等于prime[j],所以到此终止,后面的prime[]会比i的那个质因子大

void Prime(){
    memset(check,0,sizeof(check));
    int cnt=0;
    for(int i = 2; i<N; i++){
        if(!check[i])
            prime[cnt++]=i;
        for(int j=0;j<cnt && prime[j]*i<N; j++){
            check[i*prime[j]] = 1;
            if(i % prime[j]==0)
                break;
        }
    }
}
posted @ 2018-09-29 10:02  天使的羽翼  阅读(167)  评论(0编辑  收藏  举报