质数筛——埃拉托斯特尼筛法

#include <iostream>
#include <vector>
using namespace std;

// 实现埃拉托斯特尼筛法的函数
vector<int> sieveOfEratosthenes(int n) {
    // 创建一个布尔类型的向量 isPrime,长度为 n + 1,初始值都设为 true
    vector<bool> isPrime(n + 1, true);
    // 0 和 1 不是素数,将它们对应的标记设为 false
    isPrime[0] = isPrime[1] = false;

    // 从 2 开始遍历到根号 n
    for (int p = 2; p * p <= n; ++p) {
        // 如果当前数 p 是素数
        if (isPrime[p]) {
            // 将 p 的所有倍数标记为非素数
            for (int i = p * p; i <= n; i += p) {
                isPrime[i] = false;
            }
        }
    }

    // 用于存储找到的素数
    vector<int> primes;
    // 遍历 isPrime 向量,将标记为 true 的数(即素数)添加到 primes 向量中
    for (int i = 2; i <= n; ++i) {
        if (isPrime[i]) {
            primes.push_back(i);
        }
    }

    return primes;
}

int main() {
    int n = 30;
    // 调用 sieveOfEratosthenes 函数找出小于等于 n 的所有素数
    vector<int> primes = sieveOfEratosthenes(n);

    cout << "小于等于 " << n << " 的素数有: ";
    for (int prime : primes) {
        cout << prime << " ";
    }
    cout << endl;

    return 0;
}

代码说明

  1. 算法逻辑:
    • 初始化:创建一个长度为 n + 1 的布尔型向量 isPrime,初始值都设为 true,并把 isPrime[0]isPrime[1] 设为 false,因为 0 和 1 不是素数。
    • 筛选素数:从 2 开始遍历到 根号n,对于每个素数 p,把它的倍数(从 p * p 开始)标记为非素数。
    • 收集素数:遍历 isPrime 向量,把标记为 true 的元素对应的下标(即素数)存到 primes 向量里。
  2. 主函数:
    • 设定 n 的值为 30,调用 sieveOfEratosthenes 函数找出小于等于 30 的所有素数。
    • 输出这些素数。
posted @ 2025-02-17 20:09  ToFuture$  阅读(68)  评论(1)    收藏  举报