📌  相关文章
📜  计算范围内素数的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:28:04.934000             🧑  作者: Mango

计算范围内素数的 C++ 程序

本文将介绍一个用 C++ 编写的程序,能够计算指定范围内的所有素数。该程序采用了欧拉筛法,具有较快的运行速度。

欧拉筛法

欧拉筛法,也称线性筛法,是一种快速筛选素数的方法。与传统方法不同,欧拉筛法在筛选过程中,一个数只会被它的最小质因子筛去一次,因此时间复杂度为 $O(n)$。

算法步骤如下:

  1. 初始化 $is_prime$ 数组为 true,$prime$ 数组为空。
  2. 从 $2$ 开始遍历每个数 $i$:
    1. 如果 $i$ 是素数,将其加入 $prime$ 数组。
    2. 遍历 $prime$ 数组,如果 $i$ 与当前素数的乘积大于指定范围,则退出循环。
    3. 如果 $i$ 被当前素数整除,将 $is_prime[i]$ 设为 false,并退出循环。
    4. 如果 $i$ 未被整除,则将 $i$ 乘上当前素数。
C++ 程序

下面给出欧拉筛法的 C++ 实现代码:

vector<int> getPrimes(int n) {
    vector<bool> is_prime(n + 1, true);
    vector<int> primes;
    for (int i = 2; i <= n; ++i) {
        if (is_prime[i]) {
            primes.push_back(i);
        }
        for (int j = 0; j < primes.size() && i * primes[j] <= n; ++j) {
            is_prime[i * primes[j]] = false;
            if (i % primes[j] == 0) {
                break;
            }
        }
    }
    return primes;
}

该函数接收一个正整数 $n$,返回一个 vector,其中包含指定范围内的所有素数。

注:该代码需要包含 vectoralgorithm 头文件。

性能分析

欧拉筛法的时间复杂度为 $O(n)$,因此该程序的运行速度相对较快。

但需要注意的是,空间复杂度为 $O(n)$,如果需要计算较大范围内的素数,可能会有内存溢出的风险。因此,可以通过逐步遍历较小范围内的素数来减少内存使用。

总结

本文介绍了一个用 C++ 编写的计算范围内素数的程序,采用了欧拉筛法,并给出了该算法的实现代码。相对于传统方法,欧拉筛法具有更快的运行速度,是一种较为高效的素数筛选方法。