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(实际大些)