看到这个题目时,学过c的估计都会轻松一笑,觉得很简
单,不就素数的输出嘛,有什么可说的,但就这么个简单的问
题,可以有多种处理办法,瞬时让自己的逼格升级很多。对于
初学c的朋友们可以借鉴下哦!希望能够共同能够进步。
一、首先,我们还是先来回顾下素数的概念:
素数:是指除了能被1和它本身整除,不能被其它任何整数整除的数。
二、知道了什么是素数,那么接下来就得思考用c语言怎么把
一个范围内的素数输出来:
显然,对于一个数我们可以让它去模2到这个数之间的值,如果这个期间有模
下来的结果为零,那么它就必然不是素数。
三、我们举个例子
例:输出100-200之间的素数。
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for(j = 100; j < 200; j++) //j表示100-200的素数
for(i = 2; i < j; i++)
{
if(j%i == 0)
{
break;
}
if(i+1 == j)
{
printf("%d ",j);
}
}
printf("\n");
return 0;
}
这就是我们分析题目后可以写出的最简单的或者说什么都不考虑,顺着思维自然而然的写出来的代码。
!!! 所以接下来我要说的第四步就是升级逼格,写出让高质量运行效率高的代码。
四、升级逼格(还是上面的例子)
1、我们想一下输出100-200之间的素数,那偶数肯定不是素数啦,那么在循环的时候,我们对于for里面i调整环节即i++可以改成i+2,但是不要忘了i的初始化,就不能为100了,将它改为101,那么这样一来我们把100-200之间的偶数跨过去,效率自然就提高啦。代码就变成了这样:
#include<stdio.h>
int main()
{
int i = 0,j = 0;
for(j = 101;j < 200;j+=2) //j表示100-200的素数
for(i = 2;i < j;i++)
{
if(j%i == 0)
{
break;
}
if(i+1== j)
{
printf("%d ",j);
}
}
printf("\n");
return 0;
}
2、然后我们有了第一步,接着我们肯定在想还可不可以优化下程序。既然我们有把偶数跨过去,肯定有朋友想到,那也可以将上述中j的范围缩小一半进行查询,即j/2。这个当然很不错,那其实和上面的是一样的道理,不同的方式罢了。那还有方法吗?
这个时候,我们可以想到,既然有除法,那开方行不行呢,当然没问题,是个非常棒的方法呢,省去了很多不必要的重复的循环。这样运行效率就大大提高啦。下面就是我们优化后的代码:
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0,j = 0;
for(j = 101; j < 200; j+=2) //j表示100-200的素数
{
for(i = 2; i < sqrt(j); i++)
{
if(j%i == 0)
{
break;
}
}
if(i>sqrt(j))
{
printf("%d ",j);
}
}
printf("\n");
return 0;
}
我想大家应该会有所收获和启发,虽然是小小的程序,可能我们没有办法一次性就写出高质的的最优的代码,但是这篇博客也是给大家一点鼓励,我们不管程序有多大,一步一步进行分析,最终找出最优的方法,写出很棒的代码。
温馨提示:记得写代码的时候给变量初始化哦!养成好的习惯哟!