素数又称为质数, 是指除了 1 和 本身之外, 不能被其他数整除的一类数。
最简单的算法:若判断 n 是否为素数, 只需判定 n 能否被2,3,4,·····,sqrt(n) 中的一个整除, 即可判定 n 是否为素数。
该算法的复杂度为 O (sqrt(n)) 。
bool isPrime(int n){
if(n <= 1) return false;
for(int i=2; i<=(int)sqrt(1.0 * n); i++)
if(n % i == 0)
return false;
return true;
}
其中 sqrt() 函数需要头文件 math.h 。
上面的算法对于 n 在 以内都是可以承受的, 但是如果判断更大范围的数, 则需要更高效的算法。
埃氏筛法 是众多筛法最为简单且最容易理解的一种,即Eratosthenes 筛法。
素数筛法的关键就在于一个 “筛” 字。算法从小到大枚举所有数,对每一个素数, 筛去它的所有倍数,剩下的就都是素数了。
下面是求解 100 以内所有的素数的程序:
#include <cstdio>
const int maxn = 101; // 表长
int prime[maxn], cnt; // prime数组存放所有素数, cnt为素数个数
bool p[maxn]; //如果i为素数, 则 p[i] 为 false;
void Find_Prime(){
for(int i=2; i<maxn; i++){ //从2开始,因为事先已知 2 为素数
if(p[i] == false){
prime[cnt++] = i;
for(int j=i+i; j<maxn; j+=i){
p[j] = true;
}
}
}
}
int main(){
Find_Prime();
for(int i=0; i<maxn; i++)
printf("%d ", prime[i]);
return 0;
}