小韦老师@神犇营-my0124-第n小的质数
题目:
描述
输入一个正整数 n,求第 n 小的质数。
输入
一个不超过 10000 的正整数 n。
输出
第 n 小的质数。
输入样例1
10
输出样例1
29
提示
有一个正整数 x,让 x 依次除以 2~x-1,若能整除,说明不是素数。
有一种更快的办法,就是让 x 依次除以 2~sqrt(x),其中 sqrt(x) 为根号 x 的值,是 double 型的。
思路:
整体思路:
定义一个计数器,初始化为 0,从 2 往后看,每找到一个素数,计数器加 1,
当计数器加到 n 的时候,就是第 n 的素数。
具体步骤:
1.定义一个变量 n,并输入 n。
2.定义一个计数器,并初始化为 0:
int cnt = 0; // 计数器,记录第几个素数(从小到大数,即为第几大的素数)
3.定义一个变量 i,用这个变量来枚举:
int i = 2; // 从 2 开始去数,有多少个素数
4.写一个死循环,循环体进行如下操作:
- 取得根号 i。
- 枚举 2~根号 i,若有某个数能整除 i,说明 i 不是素数,则直接退出循环。
- 若 i 是素数,则计数器加 1。
- 若计数器等于 n,则说明 i 是第 n 小的素数,退出死循环。
// 死循环,因为不知道什么时候会结束,会执行多少次
// 注意,写死循环一定要用 break,不要真的就无法停止了
while (1) {
int sqr = sqrt(i); // 取得根号 i
for (int j = 2; j <= sqr; j++) { // 枚举 2~根号 i,注意这里是取得根号 i
// 若 j 能整除 i,则说明 i 不是素数,直接退出 for 循环
if (i % j == 0) {
break;
}
}
// 若 for 循环自然退出,在 j 大于 sqr,则说明 i 是素数,计数器加 1
if (j > sqr) cnt++;
// 若计数器等于 n,则直接退出 while 循环,现在的 i 就是第 i 大的素数
if (cnt == n) {
break;
}
i++; // i++,看下一个数
}
5.输出 i (第 n 小的素数)。
完整代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int cnt = 0; // 计数器,记录第几个素数(从小到大数,即为第几大的素数)
int i = 2; // 从 2 开始去数,有多少个素数
// 死循环,因为不知道什么时候会结束,会执行多少次
// 注意,写死循环一定要用 break,不要真的就无法停止了
while (1) {
int sqr = sqrt(i); // 取得根号 i
for (int j = 2; j <= sqr; j++) { // 枚举 2~根号 i,注意这里是取得根号 i
// 若 j 能整除 i,则说明 i 不是素数,直接退出 for 循环
if (i % j == 0) {
break;
}
}
// 若 for 循环自然退出,在 j 大于 sqr,则说明 i 是素数,计数器加 1
if (j > sqr) cnt++;
// 若计数器等于 n,则直接退出 while 循环,现在的 i 就是第 i 大的素数
if (cnt == n) {
break;
}
i++; // i++,看下一个数
}
cout << i; // 输出第 n 大的素数
return 0;
}