素数

参考链接:https://cloud.tencent.com/developer/article/2054290

 

朴素素数:

bool rule(int n){
    for(int i=2;i*i<=n;i++)
        if(n%i==0) return false;
    return true;
}

 

埃氏筛法 :
从2开始,将每个质数的倍数都标记成合数(限制条件为倍数小于n),以达到筛选素数的目的。

 

const int N=1e8;
int vis[N];
void prime(int n){
    vis[0]=vis[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]){
            for(int j=i*i;j<=n;j+=i)//n是素数,所以n*n,n*(n+1)不是素数
                vis[j]=1;
        }
    }
}//当vis[i]==0的时候表示i为素数

埃氏筛法的缺陷 :对于一个合数,有可能被筛多次。例如 30 = 2 * 15 = 3 * 10 = 5*6……如何确保每个合数只被筛选一次,我们用它的最小质因子来筛选,便是欧拉筛法。

此刻引入欧拉筛

欧拉筛:

让每个合数只被它的最小质因子筛选一次,以达到不重复的目的

const int N=1e8;
int vis[N],prime[N];//vis的素数标记数组,prime保存素数
void Prime(int n){
    for(int i=2;i<=n;i++){
        if(!vis[i]) prime[++prime[0]]=i;//prime[0]为素数个数
        for(int j=1;j<=prime[0]&&i*prime[j]<=n;j++){//遍历已经保存素数中
            vis[i*prime[j]]=1;
            if(i%prime[j]==0)break;//优化
//i = 8 ,j = 1,prime[j] = 2,如果不跳出循环,prime[j+1] = 3,8 * 3 = 2 * 4 * 3 = 2 * 12,在i = 12时会计算。因为欧拉筛法的原理便是通过最小素因子来消除。
} } }

 

posted @ 2022-11-21 21:14  JerryTang菜菜  阅读(144)  评论(0)    收藏  举报