埃氏筛 c++实现
时间: 2025-05-30 07:38:04 浏览: 16
### 埃拉托斯特尼筛法(埃氏筛)的 C++ 实现
埃拉托斯特尼筛法是一种用于找出小于等于给定整数 \( n \) 的所有素数的经典算法。该方法通过逐步标记合数来保留素数,具有较高的效率。
以下是基于埃氏筛原理的一个标准 C++ 实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 函数:返回一个小于等于 n 的所有素数列表
vector<int> sieveOfEratosthenes(int n) {
vector<bool> isPrime(n + 1, true); // 初始化布尔数组,默认全部为真 (true 表示可能是素数)
isPrime[0] = isPrime[1] = false; // 将 0 和 1 设置为非素数
for (int i = 2; i * i <= n; ++i) { // 遍历到 sqrt(n)
if (isPrime[i]) { // 如果当前数字是素数,则将其倍数标记为非素数
for (int j = i * i; j <= n; j += i) { // 从 i*i 开始标记,因为更小的倍数已经被之前的素数标记过了
isPrime[j] = false;
}
}
}
// 收集所有剩余的素数
vector<int> primes;
for (int i = 2; i <= n; ++i) {
if (isPrime[i]) {
primes.push_back(i);
}
}
return primes;
}
int main() {
int n;
cout << "请输入要查找的最大范围 n:" << endl;
cin >> n;
vector<int> primes = sieveOfEratosthenes(n);
cout << "小于等于 " << n << " 的所有素数如下:" << endl;
for (auto prime : primes) {
cout << prime << " ";
}
cout << endl;
return 0;
}
```
#### 关键点解析
上述代码实现了经典的埃氏筛法逻辑,其中的关键部分包括:
- 使用 `vector<bool>` 来表示每个数字是否为素数[^1]。
- 外层循环仅需遍历至 \( \sqrt{n} \),这是因为如果某个数不是素数,它必然可以分解成两个因子,其中一个不大于它的平方根[^3]。
- 内层循环从 \( i^2 \) 开始标记合数,而非从 \( 2i \) 或其他较小值开始,这样能减少不必要的重复操作并提高性能。
此实现的时间复杂度为 O\(n\log(\log n)\),非常适合中小规模的数据输入场景。
---
###
阅读全文
相关推荐


















