筛法筛一下存到数组就可以,线性筛更好了。
结果:104743
#include<iostream>
#include<string.h>
#define maxin 200000
using namespace std;
int a[maxin];
int b[maxin];
int main()
{
int ans = 0;
memset(a,0,sizeof(a));
for(int i=2;i*i<150005;i++){
if(a[i]==0)
for(int j = i+i;j<150005;j+=i ){
a[j] = 1;
}
}
for(int i=2;i<150005;i++){
if(a[i]==0){
ans++;
if(ans==10001){
cout<<i<<endl;
return 0;
}
}
}
return 0;
}
更新一下:
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
#define MAX_N 200000
int is_prime[MAX_N + 5];
int prime[MAX_N + 5];
int main() {
for (int M = 2; M <= MAX_N; M++) {
if (is_prime[M] == 0) {
prime[++prime[0]] = M;
}
for (int j = 1; j <= prime[0]; j++) {
/*超出求取的范围,跳出*/
if (prime[j] * M > MAX_N) break;
/*利用 最大剩余M 筛去后面的合数, N = P * N ,P为N的最小素数,M为最大剩余部分,是唯一的*/
is_prime[prime[j] * M] = 1;
/*取值已到M的最小素数了,不继续取下去,发生重复*/
if (M % prime[j] == 0) break;
}
}
cout << prime[10001] << endl;
return 0;
}