主题思想: 简单模拟,打表
先执行一遍,算出第3000个数的大小,然后,以第3000个数,为上限,申请数组空间,和执行初始化,最后AC
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int INF=34000;
const int maxn=3005;
int prim[maxn];
bool visited[INF];
bool isPrime(int n){
int m=sqrt(n);
if(n==2||n==3||n==5||n==7) return true;
if(n%2==0||n%3==0||n%5==0||n%7==0) return false;
for(int i=2;i<=m;i++){
if(n%i==0) return false;
}
return true;
}
void init(){
int cnt=0;
memset(visited,false,sizeof(visited));
for(int i=2;i<INF;i++){
if(!visited[i])prim[++cnt]=i;
else continue;
if(cnt>3000) break;
int tmp=0;
for(int j=i+1;j<INF;j++){
if(!visited[j]){
tmp++;
if(tmp%i==0)visited[j]=true;
}
}
}
}
int main()
{
int n;
init();
while(scanf("%d",&n)!=EOF){
if(n==0) break;
printf("%d\n",prim[n]);
}
return 0;
}