Eratos筛法(筛选素数)

对于n以内的非素数必有k*n1=n(n1<n)  所以 可有p1,2p2,3p3把非素数筛选掉

实现代码:

#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int main(){
    int n;
    bool vis[10000];
    memset(vis,0,sizeof(vis));
    cin>>n;
    int m=sqrt(n+0.5);
    for(int i=2;i<=m;i++)if(!vis[i])
        for(int j=i*i;j<=n;j+=i) vis[j]=1;
    for(int i=2;i<=n;i++)
        if(!vis[i]) cout<<i<<endl;
}

时间复杂度分析:

不经过优化的时间复杂度为T(O)=n*(n/i-1)=n*(n/1+n/2+n/3+...+1-1)=n*(log n)  内层(1+1/2+1/3+..+1/n=ln(n+1)+R,   欧拉常数R=0.577218)

素数定理Π(x)~ x/ln(x);  不超过x的素数个数大约为x/lnx(实际大些)

posted @ 2019-07-14 20:40  YZBPXX  阅读(237)  评论(0编辑  收藏  举报