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

#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 的所有素数。
    • 输出这些素数。
发布于   xiins  阅读(4)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示