#include<bits/stdc++.h>
using namespace std;
const int N = 10000;
bool zt[N];//存状态,0为素数,1不是素数;先初始化所有数都是素数;
int cnt = 0;//存素数的个数;
int isprim[N];//存素数;
int main()
{
int n;
cin>>n;
for(int i =2;i<=n;i++)
{
if(!zt[i]) isprim[++cnt]=i;
for(int j = 1;j<=cnt;j++)
{
if(i*isprim[j]>n) break;
zt[i*isprim[j]]=true;
if(i%isprim[j]==0)break;//若能整除,则为最小质因子,保证所有数都是被最小质因子筛选
}
}
for(int i =1;i<=cnt;i++)
cout<<isprim[i]<<" ";
return 0;
}
i%isprim[j]可谓欧拉筛精髓,这保证每个数都被其最小质因子筛选,所以要break;
同时又保证了所有数都只被所有最小质因子筛选,与埃氏筛相比,大大提高了速度,用空间换取时间