21xrx.com
2024-11-22 08:16:56 Friday
登录
文章检索 我的文章 写文章
C++判断素数的几种方法
2023-07-05 07:25:17 深夜i     --     --
C++ 素数 判断 方法 算法

素数是指只有两个正因数(1和自身)的数,如2、3、5、7等。在计算机科学中,判断一个数是否为素数的算法是一个基本问题。下面介绍几种C++判断素数的方法。

1. 直接判断法

根据素数的定义,一个数如果除了1和它本身,再没有其他约数,那么这个数就是素数。因此,我们可以从2开始到n-1,一个个试除,看是否能被整除。如果都不能整除,那么这个数就是素数。

bool isPrime(int n) {

  if (n <= 1) return false;

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

    if (n % i == 0) return false;

  }

  return true;

}

2. 埃拉托斯特尼筛法

埃拉托斯特尼筛法(Sievers of Eratosthenes)是一种较为高效的筛出素数的方法。它的原理是,从2开始,将每个素数的倍数都标记成合数,以便后面的筛选。在筛选过程中,只需保留未被标记的数,它们就是素数。

bool isPrime(int n) {

  if (n <= 1) return false;

  bool is_prime[n+1];

  memset(is_prime, true, sizeof(is_prime));

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

    if (is_prime[i]) {

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

        is_prime[j] = false;

      }

    }

  }

  return is_prime[n];

}

3. 米勒-拉宾素性检验

米勒-拉宾素性检验是一种基于费马小定理的概率算法,可以判断一个数是否为素数。该算法的核心是判断n-1是否满足2^s * d的形式,其中d为奇数,s为正整数。如果n-1不满足这个条件,那么n一定不是素数。否则,选取一个2到n-2之间的随机数a,进行递归计算。如果结果为1或n-1,则n可能是素数,否则n一定不是素数。可以通过多次测试来提高算法的正确性。

bool isPrime(int n) {

  if (n <= 1) return false;

  if (n <= 3) return true;

  int d = n - 1, s = 0;

  while (d % 2 == 0) {

    d /= 2;

    s++;

  }

  for (int i = 0; i < 10; i++) {

    int a = rand() % (n - 2) + 2;

    int x = powMod(a, d, n);

    if (x == 1 || x == n - 1) continue;

    for (int j = 1; j < s; j++) {

      x = powMod(x, 2, n);

      if (x == n - 1) break;

    }

    if (x != n - 1) return false;

  }

  return true;

}

  
  

评论区

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