素数求解:
1.暴力
#include"iostream"
using namespace std;
bool isprime(int x){
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(isprime(i))cnt++;
}
cout<<i<<endl;
return 0;
}
2素数筛
#include"iostream"
using namespace std;
#define MAX_N 200000
int prime[MAX_N+5]={0};
int main(){
for(int i=2;i*i<=MAX_N;i++){
if(prime[i])continue;
for(int j=2*i;j<=MAX_N;j+=i){
prime[j]=1;
}
}
for(int i=2;i<=MAX_N;i++){
if(prime[i])continue;
prime[++prime[0]]=i;
}
cout<<prime[10001]<<endl;
return 0;
}
3线性筛
N=P*M
n为最小素数
#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;
}