欧拉筛(模板)

     {质数*质数  
合数={合数*质数  ==> 质数*质数*质数
     {合数*合数  ==> 质数*质数*质数*质数  ==>  质数*合数

==> 合数={质数*质数
         {质数*合数

欧拉筛:让每个合数被其最小质因子给筛掉      //由于每个数只被筛一次,时间复杂度为O(n)
#include<bits/stdc++.h>
using namespace std;
int const N=1e3+7;
int n,cnt;
int v[N];     //v[i]表示(数字)i的最小质因子
int prime[N];  //prime为质数表
int main(){
    cin >> n;
    for(int i=2;i<=n;++i){
        if(v[i]==0){     //若i的最小质因子为0,表示i是质数  //即没有被筛过,则记录素数
            v[i]=i;      //即i的最小质因子是自己
            prime[++cnt]=i;   //第cnt个素数是i
        }
        //两种for,它们意思一样,语句顺序不一样而已,以后用第一种
        //第一种
        for(int j=1;j<=cnt && prime[j]<=v[i] && i*prime[j]<=n;++j){    //访问之前所有的质数  //prime[j]<=v[i]是因为要用prime[j]作为最小质因子筛数
            //if( i*prime[j]>n ) break;
            v[ i*prime[j] ]=prime[j];  //i*prime[j]的最小质因子为prime[j]
        }
        //第二种
        /*for(int j=1;j<=cnt;++j){    //访问之前所有的质数
            if( v[i]<prime[j] || i*prime[j]>n ) break;  //若i的最小质因子即v[i]比prime[j]小,则 i*prime[j] 这个数之前就被v[i](i的最小质因子)给筛掉了
            v[ i*prime[j] ]=prime[j];
        }*/

    }
    for(int i=1;i<=cnt;++i){
      cout << prime[i] << endl;
    }
    return 0;
}
全部评论

相关推荐

生命诚可贵:先不说内容怎么样 排版就已经太差劲了 第一眼看不到重点,第二眼已经没有再看的耐心了, 篇幅占的太满了 字体不要用灰色 观感不好 想重点突出的黑色加粗就可以了 多列要点 少些大段的句子 项目经历把项目用的技术要点列出来,光写个python plc什么的太宽泛了 自我评价也有点偏多
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务