C语言-基础练习题详解

目录

前言

一、模拟用户登录情景

1、要求

2、代码

二、求两数的最大公约数

1、方法简介

2、代码

三、打印闰年

1、要求与概念

2、代码

四、打印100-200之间的素数

1、方法与概念

2、代码

3、优化1

4、优化2

五、编写程序求1-100之间的整数中出现了多少次9

1、方法

2、代码

六、分数求和

1、要求

2、代码

七、求十个整数中的最大值

1、方法

2、代码

总结


前言

本篇文章为“#正式学C语言--笔记_day-1”中练习题的答案详解。


一、模拟用户登录情景

1、要求

模拟用户登录场景,并且只能登录三次,只允许输入三次密码,若输入正确,则提示登录成功,若三次均输入错误则退出程序。

2、代码

注:其中的strcmp()为比较字符串的函数,若两个字符串相同,则输出0,需要引入头文件string.h

//模拟用户登录
int main()
{
	int i = 0;
	char password[20] = { 0 };
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:\n");
		scanf("%s", &password);
		if (strcmp(password, "123456") == 0)
		{
			printf("登陆成功");
			break;
		}
		else
			printf("密码错误\n");
	}
	if (i == 3)
		printf("已退出程序");

	return 0;
}

二、求两数的最大公约数

1、方法简介

本处采用辗转相除法。

辗转相除法:

欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。

扩展欧几里得算法可用于RSA加密等领域。

假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:

1997 / 615 = 3 (余 152)

615 / 152 = 4(余7)

152 / 7 = 21(余5)

7 / 5 = 1 (余2)

5 / 2 = 2 (余1)

2 / 1 = 2 (余0)

至此,最大公约数为1

以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

2、代码

//给定两个数,求两个数的最大公约数
int main()
{
	int a = 0;
	int b = 0;
	int ret = 0;
	printf("请输入两个数,用空格隔开>:");
	scanf("%d %d", &a, &b);
	//先把两个数从大到小放入a和b
	if (a < b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}
	//辗转相除法
	while (ret = a % b)
	{
		a = b;
		b = ret;
	}
	printf("最大公约数为:%d\n", b);
	return 0;
}

三、打印闰年

1、要求与概念

要求:打印1000-2000年之间的闰年

闰年:闰年是指年数能被400整除或者能被4整除但不能被100整除的年份

2、代码

//打印1000-2000年之间的闰年-闰年是指年数能被400整除或者能被4整除但不能不100整除的年份
int main()
{
	int i = 0;
	int count = 0;//用来计数
	for (i = 1000; i <= 2000; i++)
	{
		if ((i % 400 == 0) || (i % 4 == 0 && i % 100 != 0))//能被400整除或者能被4整除但不能不100整除

		{
			printf("%d是闰年\n", i);
			count++;
		}
	}
	printf("共有%d个", count);
	return 0;
}

四、打印100-200之间的素数

1、方法与概念

方法:试除法-即挨个取1和该数中间的数对该数进行试除,如果存在能整除的数,则它不是素数,如果不存在能整除的数,则它是素数。

素数概念:素数是指只能被1和其本身整除的数。

2、代码

//打印100-200之间的素数
//试除法
int main()
{
	int i = 0;
	int j = 0;
	int count = 0;

	for (i = 100; i <= 200; i++)
	{
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				break;
			}
		}
		if (j == i)
		{
			printf("%d是素数\n", i);
			count++;
		}
	}
	printf("素数一共有%d个", count);
	return 0;
}

3、优化1

由于如果一个数不是素数,则在1和该数本身之间一定存在两个数的乘积等于该数,比如16不是素数,16=2*8=4*4、18=2*9=3*6。并且这两个数最大不超过根号该数。所以我们只需要判断2-根号该数之间的数。如16就判断2-4;

注:sqrt()函数为求根号函数,需引头文件math.h

//打印100-200之间的素数
//试除法优化1
int main()
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		for (j = 2; j <= sqrt(i); j++)//优化处1
		{
			if (i % j == 0)
			{
				break;
			}
		}
		if (j > sqrt(i))
		{
			printf("%d是素数\n",i);
			count++;
		}
	}
	printf("一共有%d个素数", count);
	return 0;
}

4、优化2

由于偶数肯定不是素数,所以我们只需要判断奇数

//打印100-200之间的素数
//试除法优化2
int main()
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 101; i <= 200; i += 2)//优化处2
	{
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				break;
			}
		}
		if (j > sqrt(i))
		{
			printf("%d是素数\n", i);
			count++;
		}
	}
	printf("一共有%d个素数", count);
	return 0;
}

五、编写程序求1-100之间的整数中出现了多少次9

1、方法

例:假设存在1-100之间的数a,a/10存储到整型中的便是它的十位,a%10存储到整型中的便是它的个位。

2、代码

//编写程序数一下1-100的所有整数中出现多少个数字9
int main()
{
	int i = 0;
	int count = 0;

	for (i = 1; i <= 100; i++)
	{
		if (i / 10 == 9)//若十位为九则记一次数
			count++;
		if (i % 10 == 9)//若个位为九则记一次数
			count++;
	}
	printf("%d", count);

	return 0;
}

六、分数求和

1、要求

计算1/1-1/2+1/3-1/4+1/5......+1/99-1/100的值,打印出结果。

2、代码

//分数求和,计算1/1-1/2+1/3-1/4+1/5......+1/99-1/100的值,打印出结果。
int main()
{
	int i = 0;
	float add = 0;
	int flag = 1;//用来控制正负号
	for (i = 1; i <= 100; i++)
	{
		add += flag * (1.0 / i);
		flag = -flag;
	}
	printf("和为%f", add);
	return 0;
}

七、求十个整数中的最大值

1、方法

先对存储整数的数组按从小到大排序,再输出最大的数。

2、代码

//求十个整数中的最大值
int main()
{
	int arr[] = { -11,-50,-6,-4,-5,-12,-7,-8,-9,-10 };
	int i = 0;
	int max = 0;
	int tmp = 0;
	//对数组中元素按由小到大排序
	for (i = 0; i < 9; i++)
	{
		if (arr[i] > arr[i + 1])
		{
			tmp = arr[i + 1];
			arr[i + 1] = arr[i];
			arr[i] = tmp;
		}
	}
	printf("%d", arr[9]);
	return 0;
}

总结

像我这样的初学者建议多动手实践,一定要自己先根据题目写出代码完成题目的实现,再参考答案。

你可能感兴趣的:(正式C语言的学习,c语言,后端)