学习该算法是因为,写一个求两个数的最大公约数的程序,求解思路是,这两个数的最大公约数是他们具有相同素数因子的乘积。
算法思想
首先初始一个2~n的连续序列,作候选素数
第一个循环消去2的倍数
然后指向序列的下一个数字3,消去其倍数
接下来指向5,消去其倍数
按找此方法不断做下去,直到序列中没有可消元素
#include <iostream>
#include <vector>void sieveOfEratosthenes(int n) {
// 创建一个布尔类型的向量,用于标记数字是否为素数
std::vector<bool> isPrime(n + 1, true);// 将0和1标记为非素数
isPrime[0] = false;
isPrime[1] = false;// 从2开始遍历,标记素数的倍数为非素数
for (int i = 2; i * i <= n; ++i) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}// 输出所有素数
std::cout << "Prime numbers within the range 1 to " << n << " are: ";
for (int i = 2; i <= n; ++i) {
if (isPrime[i]) {
std::cout << i << " ";
}
}
std::cout << std::endl;
}int main() {
int n;
std::cout << "Enter the range to find prime numbers: ";
std::cin >> n;
sieveOfEratosthenes(n);
return 0;
}这段代码首先创建一个布尔类型的向量
isPrime
,用于标记数字是否为素数。初始时,将向量中的所有元素都标记为true
,表示都是素数。然后通过两层循环,从2开始遍历到n的平方根,将素数的倍数标记为非素数。在外层循环中,如果当前数字i是素数(即
isPrime[i]
为true
),则在内层循环中将i的倍数j标记为非素数(将isPrime[j]
设置为false
)。最后,在遍历完所有数字后,输出标记为素数的数字,即为范围内的所有素数。
在
main
函数中,用户输入一个范围n,然后调用sieveOfEratosthenes
函数来找到该范围内的所有素数,并进行输出。