1、定义法
素数是指只能被1和它本身整除的数。根据定义,只要在2到n-1(n是被判断的数)中逐一去找有没有能被它整除的数。有就不是,否则就是。
C语言伪代码如下
bool Isprime(int num)
{
if (num <= 1) // 将小于起始值的 0 和 1排除
return false;
if(num == 2) // 数学中规定 2 是素数,这个边界值千万不要出错
return true;
for (int i = 2; i < num; i++)
{
if (num%i == 0)
return false;
}
return true;
}
2、定义法改进
若所给定的数num不是素数,那么存在不等于 1 的两个约数x1 和 x2,并且满足x1 >= sqrt(num),x2 <= sqrt(num)。因此可直接搜索范围从2到sqrt(num)就可以, 使得搜索范围减少。
C语言伪代码如下
bool Isprime(int num)
{
int end = sqrt(num)+1; // end是结尾,由于是int,开根号后要 +1
if (num <= 1) //边界值处理,同上
return false;
if(num <= 2)
return true;
for (int i = 2; i < end; i++) //搜索范围减少
{
if (num%i == 0)
return false;
}
return true;
}
3、素数分布优化
素数有一个特点,总是满足 num = 6x - 1 或 num = 6x + 1,其中 x 为自然数且有 x >= 1。
证明:6x 肯定不是素数,因为可以被 6 整除;
6x + 1 未知;
6x + 2 肯定不是素数,可以被 2 整除;
6x + 3 肯定不是素数,可以被 3 整除;
6x + 4 肯定不是素数,可以被 2 整除;
6x + 5 未知, 并且 6x + 5 等同于 6x - 1;
因此,对于大于等于 5 的素数,不能表示成 6x - 1 或 6x + 1 的一定不是素数。能表示的部分,有一些不是素数。因此,只需找到不是素数的这部分的就可以了。 因此,在遍历的时候就可以以 6 为步长来进行判断。
bool Isprime(int num)
{
int end = sqrt(num)+1; // end是结尾,由于是int,开根号后要 +1
if (num <= 1) //边界值处理,要将2,3这俩素数剥离
return false;
if(num <= 3)
return true;
if (num%6 != 1 && num%6 != 5) //将 6x+1 和 6x+5 之外的数排除
return false;
for(int i=5; i<end; i+=6) //求num能否整除 满足6x+1 和 6x+5的
{
if(num%i == 0 || num%(i+2) == 0)
return false;
}
return true;
}
本文介绍了三种判断素数的算法优化方法:1)基础定义法;2)通过只搜索到平方根来改进效率;3)利用素数分布规律进行优化,以6为步长进行判断。通过这些方法,可以更高效地识别素数。
952

被折叠的 条评论
为什么被折叠?



