Skip to content

Latest commit

 

History

History
51 lines (40 loc) · 1.83 KB

1013. 数素数.md

File metadata and controls

51 lines (40 loc) · 1.83 KB

【PAT B-1013】数素数

题意概述

令$P_i$ 表示第 i 个素数,给出两个数 M 和 N,求$P_M$到$P_N$的所有素数。

输入输出格式

输入在一行中给出 M 和 N,其间以空格分隔。

输出从$P_M$到$P_N$的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。

数据规模

$$M\le N\le{10}^4$$

算法设计

定义两个循环变量 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$级别。但暴力的算法仍然可以很轻松地通过本题的评测,说明本题的测试数据并不强。

C++代码

#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;
}