令$P_i$ 表示第 i 个素数,给出两个数 M 和 N,求$P_M$到$P_N$的所有素数。
输入在一行中给出 M 和 N,其间以空格分隔。
输出从$P_M$到$P_N$的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
定义两个循环变量 i 和 j,i 负责从 2 开始枚举所有的正整数,j 负责记录已经枚举过多少素数,当 i 为素数时,判断 j 是否在$\left[M,N\right]$之间,如果在,就输出 i。当$j\geq N$时即可跳出循环。 循环的时间复杂度为$O\left(n\right)$,暴力判断一个数是否为素数的时间复杂度为$O\left(\sqrt n\right)$,那么整个算法的时间复杂度为$O\left(n^{1.5}\right)$。但这里的 n 最大不是${10}^4$,而是要取决于第${10}^4$个素数的值。第${10}^4$个质数其实是 104729,达到了${10}^5$级别。但暴力的算法仍然可以很轻松地通过本题的评测,说明本题的测试数据并不强。
#include <bits/stdc++.h>
using namespace std;
using gg = long long;
bool isPrime(gg n) {
if (n < 2) // n小于2,一定不是素数
return false;
for (gg i = 2; i <= (gg)sqrt(n); ++i) //遍历2~根号n所有的数
if (n % i == 0) // n能被i整除,说明n不是素数
return false;
return true; // n不能被2~n任何数整除,则n是素数
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
gg mi, ni;
cin >> mi >> ni;
for (gg i = 2, j = 0; j <= ni; ++i) {
if (isPrime(i)) {
++j;
if (j >= mi and j <= ni) {
cout << i << ((j - mi + 1) % 10 == 0 or j == ni ? '\n' : ' ');
}
}
}
return 0;
}