时间复杂度:O(n)
特点:对每个合数只进行一次,筛选效率高于埃氏筛法
#include <iostream>
#include<string.h>
using namespace std;
const int maxn=100;
int prime[maxn];//存储素数
bool visit[maxn];//标志下标i是否为素数
void euler(int n){
int num=0;//第几个素数
memset(visit,true,sizeof(visit));//首先全部置为素数
for (int i = 2; i <= n; i++)
{
if (visit[i])//如果是素数,存入prime
{
prime[++num]=i;
}
for (int j =1; j <=num&&i*prime[j]<maxn; j++)//枚举num以内的素数,素数*倍数=合数
{
visit[i*prime[j]]=false;
if(i%prime[j]==0)break;//避免重复筛选
/*
num=1 i=2 -- 2*2=4
num=2 i=3 -- 3*2=6,3*3=9
num=2 i=4 -- 4*2=8 剪枝否则筛选 4*3=12
num=3 i=5 -- 5*2=10 5*3=15 5*5=25
num=3 i=6 -- 6*2=12 剪枝否则筛选 6*3=18 6*5=30 , 当i=9和15时会进行筛选,避免重复
*/
}
}
}
int main(){
int n;
cin>>n;
euler(n);
for (int i = 1; i < 20; i++)
{
cout<<prime[i]<<" ";
}
return 0;
}