1.暴力模拟:
时间复杂度O(n*sqrt(n))
#include<iostream>
using namespace std;
int ss(int n)
{
if(n==1||n==0) return 0;//1和0不是素数
for(int i=2;i*i<=n;i++)//优化
if(n%i==0) return 0;//如果有因数,说明不是素数
return 1;//遍历完退出循环后 说明就是素数
}
int main()
{
for(int i=0;i<=100;i++)
if(ss(i)) cout<<i<<" ";
else continue;
return 0;
}
2. 埃氏筛:
时间复杂度O(n*log(logn))
具体可以理解为:
通过2是素数 可以说明4,6,8....2*i不是素数,所以ss[4]=false.....
通过3是素数 可以说明6,9,12....3*i不是素数,所有ss[6]=false....
#include<iostream>
using namespace std;
bool ss[2000];
int main()
{
int n;
cin>>n;
for(int i=2;i<=n;i++) ss[i]=true;//先初始化所有数都是素数
for(int i=2;i<=n;i++)//跳过0,1从2开始
if(ss[i])
{
for(int j=i;i*j<=n;j++)
ss[i*j]=false;//如果是i素数的话 2*i 3*i ...都不是素数
}
for(int i=2;i<=n;i++)
if(ss[i]) cout<<i<<" ";
return 0;
}
3. 欧拉筛(线性筛):
时间复杂度O(n)
#include<iostream>
#include<cstring>
const int N=1e4+10;
using namespace std;
bool ss[N];
int main()
{
int n;//筛选出[0,n]区间的素数;
cin>>n;
int pr[N];//
int cnt=0;
memset(ss,true,sizeof(ss));//先初始化所有数都是素数
ss[0]=ss[1]=false;//排除0,1;
for(int i=2;i<n;i++)
{
if(ss[i]) pr[cnt++] = i; //选出素数
for(int j=0;j<cnt&&pr[j]*i<=n;j++)
{
ss[pr[j]*i]=false; //筛出非素数
if(i%pr[j]==0) break; //重复筛选,跳出循环
}
}
for(int i=0;i<=n;i++)
if(ss[i]) cout<<i<<" ";
return 0;
}