#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
//素数的判断
bool isPrime(int n){
if(n<=1) return false;
int sqr = (int)sqrt(1.0*n);
for(int i=2;i<=sqr;i++){
if(n%i==0) return false;
}
return true;
}
bool isPrime1(int n){
if(n<=1) return false;
for(int i=2;i*i<=n;i++){//当n没有接近int型变量的范围上届,若n接近,将i定义为long long类型
if(n%i==0) return false;
}
return false;
}
//素数表的获取(以下算法在n是1e5的范围内可以承受),时间复杂度O(n*sqrt(n))
//const int maxn = 101;//表长
//int prime[maxn],pNum = 0; //prime数组存放所有素数,pNum为素数个数
//bool p[maxn] = {0}; //p[i] == true表示i是素数
//void Find_Prime(){
// for(int i =1;i<maxn;i++){
// if(isPrime(i)==true){
// prime[pNum++] = i; //是素数则把i存入prime数组
// p[i] = true;
// }
// }
//}
//素数表获取(用Eratosthenes筛法),时间复杂度为O(nloglog(n))
//素数筛法的关键就在于一个“筛”字。算法从小到大枚举所有数
//对每一个素数,筛去它的所有倍数,剩下的就都是素数
const int maxn = 101;//表长
int prime[maxn],pNum = 0; //prime数组存放所有素数,pNum为素数个数
bool p[maxn]; //如果i为素数,则p[i]为false,表示不会筛掉;否则,p[i]为true,表示会筛掉。
void Find_Prime1(){
for(int i=2;i<maxn;i++){ //从2开始,i<maxn结束,注意不能写成i<=maxn
if(p[i]==false){
prime[pNum++] = i; //把素数i存到prime数组中
for(int j=i+i;j<maxn;j+=i){
//筛去所有i的倍数,循环条件不能写成j<=maxn
p[j] = true;
}
}
}
}
int main(){
Find_Prime1();//在日常使用时很容易忘写,因此结果不对时要检查是否漏写
for(int i=0;i<pNum;i++){
printf("%d ",prime[i]);
}
return 0;
}