📜  C++示例 判断素数(1)

📅  最后修改于: 2023-12-03 15:29:55.369000             🧑  作者: Mango

判断素数

素数指的是只能被1和自己整除的数,是数学上一个重要的概念。在程序中,判断一个数是否为素数也是一个常见的问题。接下来,我们将以C++示例来介绍如何判断素数。

方法一:暴力枚举

暴力枚举的思路很简单,就是从2开始枚举到该数的平方根,看是否能整除。代码如下:

bool isPrime(int n) {
    if (n <= 1) return false; // 1不是素数
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return false; // 可以整除,不是素数
    }
    return true;
}
方法二:优化枚举

在方法一中,我们枚举到该数的平方根,但实际上只需要枚举到该数的一半即可。因为如果该数可以被大于一半的数整除,那么这个数的另一个因子一定小于一半,不可能同时大于一半。另外,像4,6,8这些偶数都不是素数,因此我们可以先判断是否为偶数,如果是就直接返回false。

bool isPrime(int n) {
    if (n <= 1) return false; // 1不是素数
    if (n == 2) return true;  // 2是素数
    if (n % 2 == 0) return false; // 偶数肯定不是素数
    for (int i = 3; i * i <= n; i += 2) { // 从3开始,步长为2
        if (n % i == 0) return false; // 可以整除,不是素数
    }
    return true;
}
方法三:埃氏筛

埃氏筛的思路很简单,就是从2开始,将所有素数的倍数都标记为合数,一直到最后剩下的未标记的数都是素数。实际上,我们只需要标记到n的平方根即可,因为大于n的数肯定已经被标记过了。代码如下:

bool isPrime(int n) {
    if (n <= 1) return false; // 1不是素数
    vector<bool> is(n + 1, true);
    for (int i = 2; i * i <= n; i++) {
        if (is[i]) {
            for (int j = i * i; j <= n; j += i) {
                is[j] = false;
            }
        }
    }
    return is[n];
}
总结

以上是三种判断素数的方法,它们都是基于数学上的定理和思想,但实际上还有更加高效的算法,比如米勒-拉宾素数判定法。无论哪种方法,我们都可以利用它们来判断一个给定的数是否为素数。