zoukankan      html  css  js  c++  java
  • Eratosthenes筛法

    #include<bits/stdc++.h>
    #define maxn 1000010
    using namespace std;
    
    int x;
    int cnt,isprime[maxn];
    bool notprime[maxn];
    
    void shai(int n){
        for(int i=2;i<=n;i++){
            if(notprime[i]==false){
                isprime[++cnt]=i;//把i加到质数表中,cnt计数1 
                for(int j=2;j<=n/i;j++)
                    notprime[j*i]=true;//把所有i的倍数标记为notprime 
            }
        }
    }
    
    int main(){
        cin>>x;
        shai2(x);
        for(int i=1;i<=cnt;i++)
            cout<<isprime[i]<<" ";
        cout<<endl;
        return 0;
    } 

    还可以优化常数:

    void shai2(int n){//优化 
        for(int i=2;i<=n;i++){
            if(notprime[i]==false){
                isprime[++cnt]=i; 
                for(int j=i*i;j<=n;j+=i)//前面的已经筛过了,从i*i开始可加速,注意不影响复杂度 
                    notprime[j]=true;//把所有i的倍数标记为notprime 
            }
        }
    }
  • 相关阅读:
    第一周作业
    第一次作业
    第八周作业
    第七周作业
    第六周作业
    第五周作业
    第四周作业
    第三周作业
    第二周作业
    第一周作业2
  • 原文地址:https://www.cnblogs.com/DReamLion/p/14365121.html
Copyright © 2011-2022 走看看