如何用位图实现埃氏筛法,给出C++代码
时间: 2024-09-29 16:03:17 浏览: 29
C++实现位图图片的显示代码.zip
埃拉托斯特尼筛法是一种用于找出所有小于给定整数n的质数的经典算法。位图(Bit Array)通常用来优化空间,因为我们可以只存储每个数字是否是质数的信息,而不需要存储每个数字本身。
下面是使用位图实现埃拉托斯特尼筛法的基本步骤:
1. 初始化一个大小为n的布尔数组(0表示非质数,1表示质数),并将前两个元素标记为非质数,因为1和0不是质数。
2. 遍历从2到sqrt(n),对于每个当前的质数i,将其倍数(i^2开始,每次增加i)设置为合数(即在位图上置0)。这是因为如果j(i * j <= n)已经是合数,那么它的因数肯定包含i,所以我们只需要检查到i^2即可避免重复处理。
3. 最终剩下的未被标记为0的数都是质数。
以下是C++代码示例:
```cpp
#include <vector>
#include <cmath>
void sieveOfEratosthenes(int n, std::vector<bool>& primes) {
// 将前两个数视为非质数
for (int i = 2; i <= n; ++i)
primes[i] = true;
for (int p = 2; p * p <= n; ++p) {
if (primes[p]) { // 如果p是质数
for (int i = p * p; i <= n; i += p) { // 设置其倍数为合数
primes[i] = false;
}
}
}
}
// 主函数演示如何使用
int main() {
int limit = 50;
std::vector<bool> primes(limit + 1, true); // 创建位图
sieveOfEratosthenes(limit, primes);
// 输出所有的质数
for (int i = 2; i <= limit; ++i) {
if (primes[i])
std::cout << i << " ";
}
return 0;
}
```
阅读全文