素数的定义
素数(质数)是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。
方法一:暴力枚举法
这是最简单直接的方法,对于一个数 n
,从 2 到 n-1
逐一检查是否能整除 n
,若都不能整除,则 n
是素数。
#include <iostream>
// 判断素数的函数
bool isPrime(int n) {
if (n <= 1) return false;
for (int i = 2; i < n; ++i) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
int num = 17;
if (isPrime(num)) {
std::cout << num << " 是素数。" << std::endl;
} else {
std::cout << num << " 不是素数。" << std::endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:O(n),其中 �n 是待判断的数。
- 空间复杂度:O(1),只使用了常数级的额外空间。
方法二:优化的暴力枚举法
实际上,只需要检查从 2 到 n 的数是否能整除 n
即可。因为如果 n
不是素数,那么它一定可以分解为两个因数 a 和 b,其中 �≤�a≤n 且 �≥�b≥n。【符号处理的不好,大家将就着看哈】
#include <iostream>
#include <cmath>
// 判断素数的函数
bool isPrime(int n) {
if (n <= 1) return false;
int limit = std::sqrt(n);
for (int i = 2; i <= limit; ++i) {
if (n % i == 0) {
return false;
}
}
return true;
}
int main() {
int num = 17;
if (isPrime(num)) {
std::cout << num << " 是素数。" << std::endl;
} else {
std::cout << num << " 不是素数。" << std::endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:O(n),其中 n 是待判断的数。
- 空间复杂度:O(1),只使用了常数级的额外空间。
方法三:埃拉托斯特尼筛法(用于判断多个数是否为素数)
如果需要判断多个数是否为素数,可以使用埃拉托斯特尼筛法预先计算出一定范围内的所有素数。
#include <iostream>
#include <vector>
// 生成素数表
std::vector<bool> sieveOfEratosthenes(int n) {
std::vector<bool> isPrime(n + 1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= n; ++i) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}
return isPrime;
}
int main() {
int limit = 20;
std::vector<bool> primeTable = sieveOfEratosthenes(limit);
for (int i = 0; i <= limit; ++i) {
if (primeTable[i]) {
std::cout << i << " 是素数。" << std::endl;
} else {
std::cout << i << " 不是素数。" << std::endl;
}
}
return 0;
}
- 时间复杂度:O(nloglogn),其中 n 是筛法的上限。
- 空间复杂度:O(n),主要用于存储素数表。