线性筛

#include<bits/stdc++.h>
#define maxn 100000010
using namespace std;

int x;
int cnt,isprime[maxn],mindiv[maxn];
bool notprime[maxn];

void shai(int n){
    for(int i=2;i<=n;i++){
        if(notprime[i]==0){
            isprime[++cnt]=i;
            mindiv[i]=i;//最小质因子,用来标记n 
        }
        for(int j=1;(j<=cnt)&&(i*isprime[j]<=n);j++) {
            notprime[i*isprime[j]]=true;
mindiv[i*isprime[j]]=i;
if(!i%isprime[j]) break;//质数再大一点就超了,mindiv[i]就不是最小质因子了 } } } int main(){ cin>>x; shai(x); for(int i=1;i<=cnt;i++) cout<<isprime[i]<<" "; // cout<<cnt; cout<<endl; return 0; }

 

另一种简单一点的写法:

void shai2(int n){
    for(int i=2;i<=n;i++){
        if(notprime[i]==0){
            isprime[++cnt]=i;
        }
        for(int j=1,t;(j<=cnt)&&((t=i*isprime[j])<=n);j++) {
            notprime[t]=true;
            if(!i%isprime[j]) break;
        }
    }
}

 

 

posted @ 2021-02-03 08:02  DReamLion  阅读(71)  评论(0编辑  收藏  举报