📅  最后修改于: 2023-12-03 15:11:15.475000             🧑  作者: Mango
欧拉筛法(Eratosthenes筛网)是查找素数的一种经典算法。以下是一个用C++编写的Eratosthenes筛网程序。
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
const int MAX_N = 1000000; // 筛网上限
vector<bool> is_prime(MAX_N, true);
void sieve() {
is_prime[0] = is_prime[1] = false; // 0和1不是素数
int limit = sqrt(MAX_N);
for(int i = 2; i <= limit; ++i)
if(is_prime[i])
for(int j = i * i; j < MAX_N; j += i)
is_prime[j] = false;
}
int main() {
sieve();
for(int i = 0; i < 100; ++i)
if(is_prime[i])
cout << i << " ";
return 0;
}
首先,我们定义了一个常量MAX_N
为筛网的上限,即我们需要在1到MAX_N
之间筛选素数。然后,我们使用一个vector
来记录每个数是否是素数。初始化时,所有的数都被认为是素数,因此我们将所有的bool
值都初始化为true
。
接下来,我们定义了void sieve()
函数,该函数用于实施筛选操作。首先,我们将0和1标记为非素数。然后,我们计算limit
为MAX_N
的平方根,因为一个非素数必然包含一个小于等于它平方根的素数因子。因此,我们只需处理小于等于平方根的素数。对于每个素数p
,我们从p * p
开始标记其倍数为非素数。
最后,我们在main
函数中调用sieve
函数,之后打印前100个素数。需要注意的是,我们使用了下标运算符([]
)来访问vector
中的元素。
本文介绍了一个用于Eratosthenes筛网的C++程序,该程序使用了vector
来记录每个数是否是素数,并使用了sieve
函数实施筛选操作。需要注意的是,程序并未完全优化。例如,我们可以在实施筛选操作时跳过偶数并使用位运算等技术来加速素数判断。但总体来说,该程序为初学者提供了一个简单而易懂的Eratosthenes筛网程序实现。