Problem 7
10001st prime
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
What is the 10 001st prime number?
第10001个素数
列出前6个素数,它们分别是2、3、5、7、11和13。我们可以看出,第6个素数是13。
第10,001个素数是多少?
代码演示
暴力解法
#include<iostream>
using namespace std;
inline bool is_prime(int x){
if(x<=1)return false;
for(int i=2;i*i<=x;i++){
if(x%i==0)return false;
}
return true;
}
int main(){
int cnt=0,i=1;
while(cnt<10001){
i++;
if(is_prime(i)) cnt+=1;
}
cout<<i<<endl;
return 0;
}
线性筛法
#include<iostream>
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;
is_prime[prime[j]*M]=1;
if(M%prime[j]==0)break;
}
}
cout<<prime[10001]<<endl;
return 0;
}
素数筛法
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
using namespace std;
#define MAX_N 200000
int is_prime[MAX_N + 5];
int main() {
for (int i = 2; i * i <= MAX_N; i ++) {
if (is_prime[i]) continue;
for (int j = 2 * i; j <= MAX_N; j += i) {
is_prime[j] =1;
}
}
for (int i = 2; i <= MAX_N; i++) {
if (is_prime[i]) continue;
is_prime[++is_prime[0]] = i;
}
cout << is_prime[10001] << endl;
return 0;
}
答案
104743