📅  最后修改于: 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];
}
以上是三种判断素数的方法,它们都是基于数学上的定理和思想,但实际上还有更加高效的算法,比如米勒-拉宾素数判定法。无论哪种方法,我们都可以利用它们来判断一个给定的数是否为素数。