C语言初阶小练习(1.素数的打印,2.闰年的判断和打印,3.求解两个数的最大公约数)

题目1:打印100-200之间的素数(素数:只能被1和它本身整除的数字)

方法1:试除法1.0

"试除",就是不断地尝试能否整除。比如要判断自然数 x 是否质数,就不断尝试小于 x 且大于1的自然数,只要有一个能整除,则 x 是合数;否则,x 是素数。

显然,试除法是最容易想到的思路。不客气地说,也是最平庸的思路。不过呢,这个最平庸的思路,也有好多种境界。不信请看下文:

假设要判断 x 是否为质数,就从 2 一直尝试到 x-1。这种做法,其效率应该是最差的

代码呈现:

//打印100-200之间的素数
//素数:只能被1和它本身整除的数字
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 100; i <= 200;i++)
	{
		//判断i是否为素数
		//拿2~i-1之间的数字试除
		int j = 0;
		int flag = 1;//假设是素数
		for(j=2;j<=i-1;j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

方法2(改版):试除法2.0

在1.0版本的基础上,我们使用了sqrt函数(开平方根函数,在math.h头文件中)

#include <math.h>
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数
		//拿2~i-1之间的数字试除
		int j = 0;
		int flag = 1;//假设是素数
		for (j = 2; j <= sqrt(i); j++)  //sqrt函数是开平方函数
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

方法3(改版):试除法3.0

在2.0版本中我们使用了sqrt函数(开平方根函数,在math.h头文件中),较少了比较的次数,在3.0版本中进一步的减少所需比对的次数

基础奇数才有是素数的可能性,所以我们去除偶数

int main()
{
	int i = 0;
	for (i = 101; i <= 200; i+=2)//只取奇数,因为偶数不可能是素数
	{
		//判断i是否为素数
		//拿2~i-1之间的数字试除
		int j = 0;
		int flag = 1;//假设是素数
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

题目2:闰年的判断和打印(打印1000年到2000年的闰年)

首先我们要先找到闰年的判断条件:

①能被4整除,并且不能被100整除的是闰年

②能被400整除的是闰年

方法1:最基础的方法

int main()
{
	int y = 0;
	for (y = 1000; y <= 2000; y++)
	{
		//判断是否为闰年
		if (y % 4 == 0)
		{
			if (y % 100 !=0 )
			{
				printf("%d ", y);
			}
		}
		if (y % 400 == 0)
		{
			printf("%d ", y);

		}
	}
	return 0;
}

方法2:改进版本

int main()
{
	int y = 0;
	for (y = 1000; y <= 2000; y+=4)//y+=4  ---->减少所需要检测的数量
	{
		//判断是否为闰年
		if ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0))
		{
			printf("%d ", y);
     	}
	}
	return 0;
}

题目3:求解两个数的最大公约数

方法1:基础法

int main()
 {
	int m = 0;
	int n = 0;
	//输入
	scanf("%d %d", &m, &n);
	int k = (m > n ? m : n);
	while (1)
	{
		if (m % k == 0 && n % k == 0)
		{
			break;
		}
		k--;
	}
	printf("%d\n", k);
	return 0;
 }

方法2:辗转相除法

辗转相除法,又称欧几里德算法(Euclidean Algorithm),是求两个数的最大公约数(greatest common divisor)的一种方法。

用较大的数除以较小的数,再以除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数。

//方法二:辗转相除法
int main()
{
	int m = 0;
	int n = 0;
	//输入
	scanf("%d %d", &m, &n);// 18 24
	int k = 0;
	while (k = m % n)
	{
		m = n;
		n = k;
	}
	printf("%d\n", n);//结果为6
	return 0;

}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值