top1编程
← 返回题目
题解

【基础】素数问题

1 条题解

  • 0
    @ 2026-7-30 1:34:18

    解题思路

    先用筛法找出范围内的素数,再统计每个 n 以前的素数数量。

    参考代码

    // 先读入题目给出的数据。
    // 再按照题目要求进行计算。
    // 最后按规定格式输出答案。
    #include <iostream>
    using namespace std;
    bool p[10000001];
    int main() {
        int n, b[100], q = 0, mx = 0;
        // 先读入所有问题,找到需要处理的最大范围。
        while (cin >> n && n) { b[q++] = n; if (n > mx) mx = n; }
        // 先假设都是素数,再用筛法标记合数。
        for (int i = 2; i <= mx; i++) p[i] = true;
        for (int i = 2; i * i <= mx; i++) if (p[i]) for (int j = i * i; j <= mx; j += i) p[j] = false;
        // 每组数据从2数到n,统计其中的素数。
        for (int k = 0; k < q; k++) { int cnt = 0; for (int i = 2; i <= b[k]; i++) if (p[i]) cnt++; cout << cnt << endl; }
        return 0;
    }
    

    复杂度分析

    排序需要 O(n^2) 时间;其余循环按照实际遍历次数计算。代码使用固定大小数组,额外空间复杂度为 O(1) 或 O(n)。

    • 1