【模板】筛素数

来源:互联网 发布:接入网络方式 编辑:程序博客网 时间:2024/06/13 05:06

筛素数也算是一个必会的知识了 方法有很多
要求:给定一个范围N,你需要处理M个某数字是否为质数的询问
介绍两个方法 都很简单

方法一朴素算法
首先明确一个道理 一个数如果有因数 那么它肯定有<=它平方根的因数
代码如下

#include<iostream>#include<cmath>using namespace std;#define size 1000001int num[size];int n,m;int Squareroot_;int work(int number_){    Squareroot_=sqrt(number_);              //求出来这个数的平方根    if(number_==1){                         //1的话特殊判断        cout<<"No"<<endl;        return 0;    }    for(int i=2;i<=Squareroot_;i++){        //从2开始枚举<=该数平方根的数         if(number_%i==0){                   //只要能整除就不是素数              cout<<"No"<<endl;            return 0;        }    }    cout<<"Yes"<<endl;    return 0;}int main(){    cin>>n>>m;    for(int i=1;i<=m;i++){        cin>>num[i];        work(num[i]);    }   }//COYG

方法二埃氏算法
这个方法我比较喜欢 因为很好理解
现将所有2~n的数都写下来 然后将所有2的倍数划去 再将所有3的倍数划去…
这样划完了所有倍数 剩下没划走的 就是素数了
最后进行访问 就能做出判断
代码如下

#include<iostream>using namespace std;#define size 10000001int Instance_[size];int n,m;bool num[size];                             //都还没划void sift_(){    num[0]=num[1]=true;                     //特判    for(int i=2;i<n;i++){        if(!num[i])        for(int j=2*i;j<=n;j+=i){            num[j]=true;        }    }}void work(){    cin>>n>>m;    sift_();                                //开划    for(int i=1;i<=m;i++){                  //访问        cin>>Instance_[i];        if(num[Instance_[i]]){            cout<<"No"<<endl;        }        else cout<<"Yes"<<endl;    }} int main(){    work();     }//COYG

不用把每个数的倍数都划一遍 光划目前还没有被划走的就行

继续努力!

0 0