5、打印100~200之间的素数

        大家好,我是立志教会大家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语言的山鬼泣江,大家再见~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值