输入一个正整数n,求第n小的质数,第n小就是从2开始的第n个。输入10输出 29。
#include <iostream>
#include <vector>
using namespace std;
bool isPrime(int n) {
if (n <= 1) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
int findNthPrime(int n) {
int count = 0, num = 1;
while (count < n) {
num++;
if (isPrime(num)) count++;
}
return num;
}
int main() {
int n;
cin >> n;
cout << findNthPrime(n) << endl;
return 0;
}
这个是筛质数的方法,用isprime。
不知道你这个问题是否已经解决, 如果还没有解决的话:格式
输入格式
一个不超过10000的正整数n。
输出格式
第n小的质数。
样例
输入样例
10
输出样例
29
分析
容易产生误区,此题输入的是一个不超过10000的正整数,则要求至少要求到第10000个质数。不是求10000之间的质数。
代码:
第一种
#include<stdio.h>
#include<math.h>
#define m 100000000 //定义大一点的数
int main()
{
int i,j,n,count=0;
scanf("%d",&n);
for(i=2;i<=m;i++){
for(j=2;j<=(int)sqrt(i);j++)
if(i%j == 0)break;
if(j>(int)sqrt(i))
count++;
if(count==n)
break;
}
printf("%d\n",i);
return 0;
}
第二种
#include<stdio.h>
#define max 1000000
int prime[max];//这个数组存储,如果数字是素数就是1,不是素数则为0;
int main(){
for(int i=0;i<max;i++)
prime[i]=1;
prime[0]=prime[1]=0;//1和0不是素数
for(int i=2;i<max;i++){
if(prime[i]==1){//素数的倍数都不是素数,
for(int j=i*2;j<max;j+=i)
prime[j]=0;
}
}
int n;
int count=0,temp;
scanf("%d",&n);
for(int i=2;i<max;i++)
{
if(prime[i]==1)count++;
if(count == n){
temp=i;
break;
}
}
printf("%d",temp);
return 0;
}
#include <iostream>
#include <math.h>
using namespace std;
bool isPrime(int x) {
for(int i=2; i<=sqrt(x); i++) {
if(x%i == 0) {
return false;
}
}
return true;
}
int main() {
int n;
cin >> n;
int count = 0;
int num = 2;
while(count < n) {
if(isPrime(num)) {
count++;
}
num++;
}
cout << num-1 << endl;
return 0;
}