21xrx.com
2025-03-27 06:38:30 Thursday
文章检索 我的文章 写文章
C++求素数个数的两种方法
2023-07-03 14:27:47 深夜i     24     0
C++ 求素数 方法

对于计算机科学爱好者和程序员来说,素数是一个经典的问题。有两种方法可以使用C++编程语言来求出素数的个数。

第一种方法是Brute-Force(暴力)方法。Brute-Force方法是最简单的方法,但效率较低。其基本思想是,对每个数字进行测试,判断其是否为素数。具体的程序可以如下:

c++
int countPrimes(int n) {
  int count = 0;
  for(int i=2; i<n; i++){
    bool isPrime = true;
    for(int j=2; j*j<=i; j++){
      if(i%j==0)
        isPrime = false;
        break;
      
    }
    if(isPrime){
      count++;
    }
  }
  return count;
}

在上面的代码中,我们声明了一个变量count来计算素数的个数。对于每个数字i,我们使用另一个循环来测试它是否为素数。如果是,count加1,否则继续下一个数字。

第二种方法是Sieve of Eratosthenes(埃拉托色尼筛选法)方法。Sieve of Eratosthenes方法的基本思想是筛选法,即我们从2开始,将所有小于n的质数的倍数标记为非素数。这样,我们只需要遍历一次2到n的数字,并统计非标记数字的个数。

Sieve of Eratosthenes方法的程序如下所示:

c++
int countPrimes(int n) {
  vector<bool> isPrime(n, true);
  for(int i=2; i*i<n; i++){
    if(!isPrime[i]) continue;
    for(int j=i*i; j<n; j+=i){
      isPrime[j] = false;
    }
  }
  int count = 0;
  for(int i=2; i<n; i++){
    if(isPrime[i]) count++;
  }
  return count;
}

在上面的代码中,我们使用一个布尔数组isPrime来记录数字的状态。我们从2开始,将所有小于n的质数的倍数标记为非素数,最后统计非标记数字的个数。

通过比较两种方法的程序,我们可以看到Sieve of Eratosthenes方法比Brute-Force方法更快。 在处理大量数字时,Sieve of Eratosthenes方法的效率更高。

  
  

评论区