【C/C++】判断一个数是否为质数——优化常见o(sqrt(n)/2)复杂度算法存在的问题

目录

    • 前言
    • 定义
    • 算法
      • 分析
      • 实现

前言

o(sqrt(n)/2)复杂度算法作为常见o(sqrt(n))复杂度算法的优化版本,能够减少后者的一半复杂度,但常见优化算法或多或少存在一些问题:有的无法对个位数正确判断、有的无法对负数正确判断…这篇博客将给出一种优化版本解决提到的问题。

定义

因数只有1和本身的自然数称为质数,或称素数。

算法

分析

根据定义,若一个数n为合数,则可以进行因数分解,且所得两个因数n1 > n2必有
n1 >= sqrt(n),n2 <= sqrt(n)
若在sqrt(n)左侧找不到因数,右侧也一定找不到,因此只需判断从2到sqrt(n)是否存在n的约数。此外,任何大于2的偶数均为合数,故只需遍历奇数即可。

实现

bool isPrime(int n)
{
    if (n < 2 || n % 2 == 0 && n > 2)
        return false; //判断是否为负数、0、1或大于2的偶数
    for (int i = 3; i <= sqrt(n); i += 2) //遍历大于2的奇数
    {
        if (n % i == 0)
            return false;
    }
    return true;
}

你可能感兴趣的:(【C/C++】判断一个数是否为质数——优化常见o(sqrt(n)/2)复杂度算法存在的问题)