素数的判断

素数的简介

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

方法一:暴力枚举

思路分析

假如说我们需要知道一个数$ x $是否为一个素数,那么我们可以通过枚举从$ 2 $到$ n-1 $的每一个数,看它是否是$ x $的因子(即通过取模运算判断是否为零)。

时间复杂度O(n)

代码实现

bool isPrime(int x)
{
    bool ans = true;
    for(int i = 2;i <= x - 1;i++){
        if(x % i == 0){
            ans = false;
            break;
        }
    }
    return ans;
}

方法一’:暴力枚举优化

思路分析

对于任何合数我们都可以表达成两个数相乘,因此,我们设一个数为$ x=ab $,则$ \sqrt{x} $=$ \sqrt{ab} $。令$ a>b $,那么a>$ \sqrt{ab} $>b,即a>$ \sqrt{x} $>b。因此,如果存在一个合数$ x $,那么必然存在一个因子小于$ \sqrt{x} $也就是说,我们只需要枚举到$ \sqrt{x} $的位置就可以了。

时间复杂度O($ \sqrt{n} $)

代码实现

bool isPrime(int x)
{
    bool ans = true;
    for(int i = 2;i <= (int)sqrt(x);i++){//(int)表示把后面的浮点数强行转化为整数。
        if(x % i == 0){
            ans = false;
            break;
        }
    }
    return ans;
}

方法二:素数表筛选法

思路分析

如果一个数是合数那么一定会存在一个非自身的因子为素数,因此我们只需要检查此数的因子有没有在素数表里。

代码实现

/*
  n:为要检测的数字
  count:素数表中素数的个数
  PrimeArray:素数表数组
*/
bool isPrime(int n; i <= count; int[] PrimeArray){
    for(int i = 0;i < count;i++){
        if(n % PrimeArray[i] == 0){
            return false;
        }
    }
    return true;
}