编写程序实现用Eratosthenes筛法寻找给定范围内的素数C++代码及运行结果
时间: 2024-09-10 13:27:44 浏览: 77
Eratosthenes筛法是一种古老的求解一定范围内所有素数的经典算法。以下是用C++编写的一个简单版本:
```cpp
#include <iostream>
#include <vector>
void sieveOfEratosthenes(int n) {
std::vector<bool> primes(n+1, true); // 初始化一个布尔数组, 2; i * i <= n; i++) { // 只需要检查到√n
if (primes[i]) { // 如果i是质数
for (int j = i * i; j <= n; j += i) { // 将i的所有倍数标记为合数
primes[j] = false;
}
}
}
// 打印出所有素数
for (int i = 2; i <= n; i++)
if (primes[i])
std::cout << i << " ";
}
int main() {
int range = 50; // 示例范围,你可以替换为你想要查找素数的上限
sieveOfEratosthenes(range);
return 0;
}
```
运行此程序,假设输入范围为50,输出将会是2、3、5、7、11、13、17、19、23、29、31、37、41、43、47,这些都是50以内的素数。
相关问题
埃拉托色尼(Eratosthenes)筛法 C++代码·
埃拉托斯特尼筛法是一种用于寻找一定范围内所有质数的经典算法。它通过从2开始,逐步将每个找到的质数的所有倍数标记为非质数,直到达到给定范围的尽头。以下是简单的C++代码实现:
```cpp
#include <iostream>
#include <vector>
// 判断是否为质数
bool isPrime(int num) {
if (num <= 1)
return false;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0)
return false;
}
return true;
}
// 埃拉托斯特尼筛法
void eratosthenesSieve(int n) {
std::vector<bool> primes(n + 1, true); // 初始化所有数字为质数
primes[0] = primes[1] = false;
for (int p = 2; p * p <= n; p++) { // 只需检查到√n
if (primes[p]) { // 如果p是质数
for (int i = p * p; i <= n; i += p) {
primes[i] = false; // 将p的倍数标记为非质数
}
}
}
// 输出结果
for (int p = 2; p <= n; p++)
if (primes[p])
std::cout << p << " ";
}
int main() {
int limit;
std::cout << "请输入一个整数作为筛选范围上限: ";
std::cin >> limit;
eratosthenesSieve(limit);
如何用位图实现埃氏筛法,给出C++代码
埃拉托斯特尼筛法是一种用于找出所有小于给定整数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;
}
```
阅读全文
相关推荐
















