筛法筛一下存到数组就可以,线性筛更好了。
结果: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;
}