判断是否为质数(素数)多方法逐优化 c/c++语言

一.质数的定义

质数(英文名:prime number)又称素数,一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。

注意:1既不是质数也不是合数,要单独讨论。

二.判断质数的方法(逐渐优化)

1.方法一

根据定义,遍历 i =(1,n),对 n % i 进行判断。

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.方法二

sqrt(n) 是 n 的算数平方根,如:\sqrt{n}  。

在c语言头文件 math.h ,在c++头文件 cmath 中。(点击头文件可跳转进cppreference查看)
 

#include //c

#include  //c++

思路:n = sqrt(n) * sqrt(n),若 n 可以表示为 a * b ,则必有a <= sqrt(n) 且 b >= sqrt(n),a 和 b 是关于sqrt(n) 对称的,只需要对 a,b 较小值取模即可,所以只需要遍历到 sqrt(n) 。

该方法二与方法一对比,对合数运行时间无差别,对质数运行时间减少一半。

这也可以用 i * i <= n 避免用算数平方根。

bool isPrime(int n)
{
  if(n == 1) return false;
  //这可以用 i * i <= n 避免用算数平方根
  for(int i = 2;i <= (int)sqrt(n); ++i)
  {
    if(n % i == 0) return false;
  }
  return true;
}

3.方法三

孪生素数:相差2的一对素数,例如:3和5 ,5和7,11和13,…,10016957和10016959等等都是孪生素数。

我们只需要掌握孪生素数猜想的结论:大于3的素数只分布在6n-1和6n+1两数列中。

(上述说明选自科普中国-科学百科-《[科普中国]-孪生素数猜想》)

bool isPrime(int n)
{
  if(n == 1) return false;
  if(n == 2 || n == 3) return true;
  //孪生素数猜想,大于3的素数一定是6n-1和6n+1的倍数
  if(n % 6 != 5 && n % 6 != 1) return false;
  for(int i = 2;i <= (int)sqrt(n); ++i)
  {
    if(n % i == 0) return false;
  }
  return true;
}

三.总结

运行速率:方法三 > 方法二 > 方法一 ;

bool类型在c++中有定义,但在c语言中需要调用头文件 stdbool.h 。

除了以上三种方法,判断质数还有其它方法,如:构建一个质数表(存放足够多素数)用于检查一个数是否存在该表从而判断,还有米勒-拉宾素性检验等。

如有疑惑可在评论区评论,欢迎大家一起交流!

你可能感兴趣的:(c++,算法,开发语言,c语言)