| #include <iostream> |
| #include <vector> |
| using namespace std; |
| |
| |
| vector<int> sieveOfEratosthenes(int n) { |
| |
| vector<bool> isPrime(n + 1, true); |
| |
| isPrime[0] = isPrime[1] = false; |
| |
| |
| for (int p = 2; p * p <= n; ++p) { |
| |
| if (isPrime[p]) { |
| |
| for (int i = p * p; i <= n; i += p) { |
| isPrime[i] = false; |
| } |
| } |
| } |
| |
| |
| vector<int> primes; |
| |
| for (int i = 2; i <= n; ++i) { |
| if (isPrime[i]) { |
| primes.push_back(i); |
| } |
| } |
| |
| return primes; |
| } |
| |
| int main() { |
| int n = 30; |
| |
| vector<int> primes = sieveOfEratosthenes(n); |
| |
| cout << "小于等于 " << n << " 的素数有: "; |
| for (int prime : primes) { |
| cout << prime << " "; |
| } |
| cout << endl; |
| |
| return 0; |
| } |
代码说明
- 算法逻辑:
- 初始化:创建一个长度为
n + 1
的布尔型向量 isPrime
,初始值都设为 true
,并把 isPrime[0]
和 isPrime[1]
设为 false
,因为 0 和 1 不是素数。
- 筛选素数:从 2 开始遍历到 根号n,对于每个素数
p
,把它的倍数(从 p * p
开始)标记为非素数。
- 收集素数:遍历
isPrime
向量,把标记为 true
的元素对应的下标(即素数)存到 primes
向量里。
- 主函数:
- 设定
n
的值为 30,调用 sieveOfEratosthenes
函数找出小于等于 30 的所有素数。
- 输出这些素数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律