素数:
素数一般指质数。质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。也就是说假设K为一个素数,那么在2~(K-1)范围内,不会再有任何自然数能作为因数。
所以有一个很简单的思路,就是暴力枚举,遍历比这个小的所有数,然后判断这个数本身能否本整除。从而判断是否为素数。
举个例子,要找出100~200之间的所有素数。
nt main(){
for (int i = 100; i < 201; i++)
{
int _flag =0;
for (int j = 2; j <= i; j++)
{
if (i%j==0)
{
_flag = 1;
continue;
}
}
if (!_flag)
{
printf("%d ",i);
}
}
return 0;
}
在这段代码中,就是暴力枚举,统统遍历一遍自然也能找出来哪些是素数。但是这个例子给的范围小,遍历起来也不困难,但是对于可能会碰到的一些大数,这个方法显然是又臭又长。
对此,有一些新的优化思路:
对于一个整数K,当K=A×B的时候,那么我们可以肯定,这一组因数的A或者B一定有一个是小于K开根号的。那么这样的话,我们就可以在第一个思路的基础上进一步缩小遍历范围,不用查找到K-1,只需要遍历到根号K即可。
再者,可以肯定的是偶数一定不是一个素数,因为有2这个因子。所以在第一层循环中i可以+2的变化,这样又可以进一步优化遍历范围。
完整代码如下:
#include <stdio.h>
#include<math.h>
//100- 200 之间的素数
//素数k表示在2到k-1之间没有因子,则偶数一定不是素数,故遍历时只用考虑偶数
//设一个数k = a * b , 可以肯定他的因子 a 或 b 一定有一个处于 2 到 sqrt(k)之间,所以遍历又最多只用考虑到平方根
//试除法
//素数求解的N种方法:1.试除法 2.筛选法 ........(待补充)
int main(){
for (int i = 100; i < 201; i+=2)
{
int _flag =0;
for (int j = 2; j <= sqrt(i); j++)
{
if (i%j==0)
{
_flag = 1;
continue;
}
}
if (!_flag)
{
printf("%d ",i);
}
}
return 0;
}
这便是最常见的判断素数时的试除法,对于后续碰到的其他素数判断方法会再补充
……