需要寻找素数,首先我们要知道素数的定义以及如何判断。
素数:素数又叫质数,质数是指在大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。--------由此我们可以得到思路:一个数如果不能被2一直到比它自己小1的数整除,那么就判定这个数为素数。于是乎就可以写出下列代码:
试除法:
这里以寻找100到200之间的素数为例,通过for循环来自增被判断数和除数,不断试除后输出符合条件的数。代码如下:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
//判断i是否为素数
//拿2~i-1之间的数字试除
int flag = 1;//假设i是素数
int j = 0;
for (j = 2; j <= i - 1; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
从上面的代码以及运行结果我们已经得知我们达到了想要的效果,那么上述代码还有优化的空间吗?答案是肯定的。注意到,如果一个数m=a*b,(a,b>=2)那么a或b中一定有一个数小于等于m的平方根,由此我们可以知道并不需要一直试除到比它本身小1的数,只需要试到小于等于它的平方根的数就行了,这里我需要用到sqrt()这个库函数,因此我们需要引用头文件#include<math.h>,优化后的代码运行结果如下:
代码如下:
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
int flag = 1;
int j = 0;
for (j = 2; j <=sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
在上面的叙述中可知,这次的运行减少循环的次数,一定程度上提高了寻找的效率,那么在此基础上还能优化吗?当然还可以啦。再次注意到,对于素数的判断来说,除2以外,所有偶数肯定不是素数,因为含有因子2,那么以寻找100到200之间的素数为例,可从101开始寻找,循环中可以每次自增2,这样的话就又可以筛掉一些数值的判断。具体代码运行结果图如下:
代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 101; i <= 200; i+=2)
{
int flag = 1;
int j = 0;
for (j = 2; j <=sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
当然上述的例子都是寻找100到200之间的素数,你也可以通过改变循环中变量的初始值和判断条件来达到你想要的目的。自此对于一定范围内素数的求法,我相信你肯定有了一定的认知和思考。学无止境,算法是多种多样的,素数的求法还有很多种,只是现在层面的我无法接触到罢了,推荐大家可以搜下《素数求解的N种境界》,里面有更多更优或者适合你的算法来编写程序。
感谢大家能够看到这,如果你有什么更好的看法,或者觉得文章有什么问题需要指出,欢迎各位留言哦,respect!!!