素数即质数,是指除了1和本身之外不能被其他数整除的一类数。
素数的判定
一个整数n需要判断在2~n-1的范围内的整数是否都不能整除n,即可判断n是否为素数,反之则为非素数。如果在2~n-1中存在n的约数,不妨设为k,即n%k==0,那么由k*(n/k)==n可知,n/k也是n的一个约数,且k与n/k中一定满足其中一个小于等于、另一个大于等于。这告诉我们只需要判断n能被2,3,....,中的一个整除,即可判定n是否为素数。该算法时间复杂度为。
代码如下:
bool isPrime(int n)
{
if(n <= 1) return false;
int sqr = (int)sqrt(1.0 * n);
for(int i = 2 ;i <= sqr ;i++){
if(n % i ==0) return false;
}
return true;
}
//当n没有接近int型变量上界时,简洁写法如下:
bool isPrime(int n){
if(n <= 1) return false;
for(int i = 2 ; i * i <= n;i++){
if(n % i == 0) return false;
}
return true;
}
素数表的获取
以上面方法得到的素数表的算法如下:
const int maxn = 101;
int prime[maxn],pNum = 0;
bool p[maxn] = {0};
void Find_Prime(){
for(int i = 1; i < maxn; i++){
if(isPrime(i) == true){
prime[pNum++] = i;
p[i] = true;
}
}
}
埃氏筛法算法如下:
const int maxn = 101;
int prime[maxn],pNum = 0;
bool p[maxn] = {0};
void Find_Prime(){
for(int i = 2; i < maxn; i++ )
{
if(p[i] == false){
prime[pNum++] = i;//如果i是素数,把素数i存到prime数组中
for(int j = i + i; j < maxn ; j += i){//筛去所有i的倍数
p[j] = true;
}
}
}
}