实现素数筛法(C++)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实现素数筛法(C++)
素数是指只能被1和自身整除的自然数。

素数筛法是一种用来找
出一定范围内的所有素数的算法。

它的基本思想是从小到大逐个筛选,将合数标记为非素数,最后留下来的就是素数。

首先,我们需要一个布尔数组来表示每个数是否为素数。

数组的
索引代表数本身,数组的值为true表示该数是素数,为false表示该
数为合数。

我们将数组初始化为全部为素数(true)。

然后,我们从2开始,将2的倍数全部标记为合数(false)。

接下来,我们找到下一个未筛
选的素数,即3。

将3的倍数全部标记为合数。

依此类推,我们将继续找到下一个未筛选的素数,并将其倍数全部标记为合数,直到达到指
定范围的上限。

最后,留下来的所有素数的索引即为我们所要的答案。

我们可以使用一个循环来实现上述算法。

具体代码如下所示:
```cpp
#include <iostream>
#include <vector>
//素数筛法函数
std::vector<int> primeSieve(int n) {
std::vector<int> primes;
std::vector<bool> isPrime(n + 1, true); //初始化全部为素数
for (int p = 2; p * p <= n; p++) {
if (isPrime[p]) {
//将p的倍数全部标记为合数
for (int i = p * p; i <= n; i += p) {
isPrime[i] = false;
}
}
}
//收集所有素数
for (int p = 2; p <= n; p++) {
if (isPrime[p]) {
primes.push_back(p);
}
}
return primes;
}
int main() {
int n;
std::cout << "请输入要找出的范围上限n:"; std::cin >> n;
std::vector<int> primes = primeSieve(n);
std::cout << "范围[2, " << n << "]内的所有素数为:" << std::endl;
for (int prime : primes) {
std::cout << prime << " ";
}
return 0;
}
```
以上代码中,我们使用了`std::vector`数据结构来存储素数。

`primeSieve`函数接受一个整数`n`作为参数,返回一个包含所有范围内素数的向量。

在`main`函数中,我们首先从用户输入中获取范围上限`n`。

然后调用`primeSieve`函数获取所有素数,并输出结果。

例如,当用户输入10作为上限时,我们将得到范围[2, 10]内的所有素数为:2 3 5 7。

素数筛法的时间复杂度为O(n log log n),其中n是指定范围的上限。

这种算法效率较高,并且可以用于找出较大范围内的素数。

这样,我们就成功实现了素数筛法的算法,并用C++代码演示了其实现过程。

希望对您有所帮助!。

相关文档
最新文档