大家好,我是立志教会大家C语言的山鬼泣江。
今天写一个简单的小程序:输出100~200之间的素数。
想要输出素数,首先我们要知道什么是素数。
素数:指的是只能被1和本身整除的数。即因数有且只有2个。
法一、遍历所有数字
在拿到这个题,相信大家的第一反应你一定和我一样:只要遍历了所有可能是因数的数字最后发现都不能被整除,不久可以输出所有的素数了嘛?
对哒,所以现在上代码!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i=0;
int count = 0;
for (i = 100; i <= 200; i++)
{
int flag = 1;
int j = 0;
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
count++;
printf("%d ", i);
}
}
printf("\n%d\n ", count);
return 0;
}
代码很简单,但是小编还是建议大家自己先敲一遍,找找问题,小编一开始看别人敲的时候也感觉非常的简单,但是自己一敲就出现了各种各样的问题。
首先,一定要注意count++的位置,一定是要放在最后打印数字的地方,千万不要放在循环!!!否则你会发现count输出会是几千......
其次,flag创建的位置是会影响结果的,倘若你是和i一起创建的,那答案就戳啦!因为每一次判断是否是素数的时候flag都要重新被初始化为1.
运行结果如图所示,最终输出了21个素数。
那么我们对这个程序能不能进行一定的优化呢?
法二、在遍历的基础上将偶数进行优化(原理:偶数一定不是素数)
众所周知,由于偶数一定可以被2整除,所以可得偶数一定不是素数,那么我们在找素数的时候是不是就可以只考虑奇数了?
我们在这里将for循环条件改成了只对奇数进行验证,我们发现答案依然是21,没有问题。
法三、倘若不是素数,则必有一个因数m<根号i。
假设i不是素数,那么他的因数一定有一个数是<=根号i的。
根据这个方法我么可以继续对代码进行优化,让j的范围继续变小。
这里我们需要使用开方函数sqrt(i),头文件是<math .h>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main()
{
int i=0;
int count = 0;
int j = 0;
for (i = 101; i <= 199; i+=2)
{
int flag = 1;
for (j = 2; j <=sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
count++;
printf("%d ", i);
}
}
printf("\n%d\n ", count);
return 0;
}
以上就是代码和运行结果,今天的小练习就到这里啦。
好啦,这是刷题系列的第五道题。我是立志教会大家学会C语言的山鬼泣江,大家再见~~~