21xrx.com
2024-11-25 05:10:45 Monday
登录
文章检索 我的文章 写文章
C++实现筛选法寻找小于等于n的素数
2023-07-04 18:34:39 深夜i     --     --
C++ 筛选法 小于等于n 素数

在编程中,寻找素数是一个常见的问题。一种常见的解决方法是使用筛选法,它可以有效地寻找小于等于n的素数。

C++提供了许多库函数和算法来寻找素数,但是使用筛选法可以提高程序的性能和效率。筛选法是一种简单而高效的算法,它使用数组来标记哪些数是素数,哪些数不是素数。

首先,我们需要创建一个数组来表示小于等于n的每个数字。我们将它们初始化为1,这代表它们是素数。接下来,我们从2开始,将2的倍数标记为非素数(即将它们的值设置为0)。然后,我们继续标记3的倍数、5的倍数、7的倍数,以此类推,直到遍历完整个数组。

最后,我们将数组中值为1的元素输出,这些元素对应的下标就是小于等于n的素数。下面是使用C++实现筛选法寻找小于等于n的素数的代码示例:


#include <iostream>

#include <cstring>

using namespace std;

int main() {

  int n;

  cin >> n;

  bool isPrime[n+1];

  memset(isPrime, true, sizeof(isPrime));

  for (int i=2; i*i<=n; i++) {

    if (isPrime[i]) {

      for (int j=i*i; j<=n; j+=i) {

        isPrime[j] = false;

      }

    }

  }

  for (int i=2; i<=n; i++) {

    if (isPrime[i])

      cout << i << " ";

    

  }

  return 0;

}

在上面的代码中,我们首先输入了一个数字n,然后创建了一个bool型数组isPrime来标记每个数字是否是素数。接着,我们将数组的所有元素初始化为true,代表它们都是素数。

随后,我们从2开始遍历数组,对于每个素数i,我们将它的倍数标记为非素数。我们只需要标记2到sqrt(n)之间的数字,因为如果一个数不是素数,那么它的最小质因数一定小于或等于它的平方根。这样可以避免重复标记。

最后,我们输出数组中所有值为true的元素,即小于等于n的素数。

使用筛选法可以有效地寻找素数,特别是对于大的数字,它的性能和效率相比其他方法要高得多。因此,如果您需要在C++中寻找小于等于n的素数,筛选法是一个值得尝试的算法。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复