素数筛法

来源:互联网 发布:淘宝联盟电脑版和手机 编辑:程序博客网 时间:2024/06/07 03:11

求1…n素数个数,要求O(n)算法。

精髓:if此数是素数,一定不会跳出,
else此数的倍数一定被它的质因子筛去了。
因此,可以避免冗余操作。

#include<iostream>#include<cstdio>using namespace std;const int maxn=1e5;int n,pri[maxn+1];//pri存储素数bool vis[maxn+1];//vis该数是否被筛去 int euler(int m){    int cnt=0;//素数个数     vis[1]=1;//并没有意义     for(int i=2;i<=m;i++)    {        if(!vis[i])//只要还没有被筛去,就是素数             pri[++cnt]=i;        for(int j=1;i*pri[j]<=m&&j<=cnt;j++)        {            vis[i*pri[j]]=1;            if(i%pri[j]==0)//精髓所在                 break;        }    }    return cnt;}int main(){    scanf("%d",&n);    printf("%d\n",euler(n));    return 0;}
0 0
原创粉丝点击