C语言例题及解析(1)

目录

1排队等电梯

2.猜数字游戏

3.三个数按从大到小输出

方法一:

方法二(三目运算符):

4.最大公约数和最小公倍数

最大公约数

求法1

辗转相除法

最小公倍数

方法1

方法2(for循环)


1排队等电梯

学校教学楼的电梯前排了很多人,前面有n个人在等电梯。电梯每次可以乘坐12人,每次上下需要的时间为4分钟(上需要2分钟,下需要2分钟)计算还需要多少分钟才能乘电梯到达楼上。(假设最初电梯在1层)

#include
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a <= 11)
		printf("2");// 人数小于等于11的时候可直接上电梯
	else
		printf("%d", (a / 12) * 4 + 2);//人数多时,12个人一部电梯,除12求出前的次数,一次4分 
                                       //钟就是乘4,最后加上自己坐电梯的两分钟
	return 0;
}

2.猜数字游戏

需要用到的头文件

#include
#include
#include

通过两个菜单函数和游戏函数来进行晚上游戏选项,通过rang,srand函数生成随机数,srand函数需要通过时间戳来随机生成数字。

#include
#include
#include
void menu()   //这是一个菜单选项
{
	printf("********************************\n");
	printf("*******     1. play      *******\n");
	printf("*******     0. exit      *******\n");
	printf("********************************\n");
}


void game()  //猜数字游戏的具体操作
{
	int ret = rand() % 100 + 1;//(生成随机数)
	int num = 0;
	//2.猜数字
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &num);
		if (num == ret)
		{
			printf("恭喜你,猜对了\n");
			break;
		}
		else if (num > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("猜小了\n");
		}
	}
}


int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//rand函数生成的随机值是固定的,需要调用srand函数来使其
                                    //随机,方式是通过时间戳获得随机的数字,srand需要接收的 
                                    //类型是unsigned in他,但是time的类型是time_c 所以需要 
                                    //进行强制类型转换
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)            //switch语句来进行对游戏选项的选择
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);        //通过do-while 语句来不断地进行游戏,直到输入0时,才能结束游戏
	return 0;
}

3.三个数按从大到小输出

方法一:

输入a,b,c 三个数,将最大值,中间值,最小值分别放在a,b,c中输出。

具体步骤如下:

(1)先比较a和b的大小,将较大者放在a中,较小者放在b中。当a值较小时,需要以下操作。

ret1 = a,a = b,b = ret1;

(2)再比较a和c的大小,较大值放在a中,较小值放在c中。当a值较小时,需要以下操作。

ret2 = a,a = c,c = ret2;

(3)最后比较b和c的大小,较大值放在b中,较大值放在c中。当b值较小时,需要以下操作。

ret3 = b,b = c,c = ret3;

总体的代码如下:

#include
int main()
{
	int ret1, ret2,ret3;
	int a = 0, b = 0, c = 0;
	scanf("%d%d%d", &a, &b, &c);
	if (a < b)
	{
		ret1 = a,a = b,b = ret1;
	}
	if (a < c)
	{
		ret2 = a,a = c,c = ret2;
	}
	if (b < c)
	{
		ret3 = b,b = c,c = ret3;
	}
	printf("%d %d %d", a, b, c);
	return 0;
}

方法二(三目运算符):

通过三目运算符来实现最大值,中值,最小值。

如下三目运算符表示  如果a>b成立就把a赋值给ret,否则就把b赋值给ret。

int ret = a>b?a:b

(1)求最大值

先求出a,b的较大值,再和c进行比较,求出较大值,也就是三个数的最大值。

max = (a > b ? a : b) > c ? (a > b ? a : b) : c;

(2)求中间值

先求出a,b的较大值再和c比较后,如果前者大那就是c为中间值,反之a,b的较大者为中间值

mid = (a > b ? a : b) > c ? c : (a > b ? a : b);

(3)求最小值

先求出a,b的较小值,和c比较后,哪个值小就把哪个值存放在中。

min = (a > b ? b : a) > c ? c : (a > b ? b : a);

整个程序的代码如下:

#include
int main()
{
	int a, b, c;
	int max, mid, min;
	scanf("%d%d%d", &a, &b, &c);;
	max = (a > b ? a : b) > c ? (a > b ? a : b) : c;
	mid = (a > b ? a : b) > c ? c : (a > b ? a : b);
	min = (a > b ? b : a) > c ? c : (a > b ? b : a);
	printf("%d %d %d\n", max, mid, min);
	return 0;
}

4.最大公约数和最小公倍数

最大公约数

求法1

通过for循环语句来实现i从到两数之间较小数的值遍历(依次减一),当i可以被两个整除时,第一个出现的就是最大公约数。

   可以通过三目运算符来找出两者的较小值将其存放在min中

int min=a < b ? a : b;
	for (int i = min; i >= 2; i--)
	{
		if (a % i == 0 && b % i == 0)
		{
			printf("%d\n", i);
			break;
		}
	}

通过从较小值往下遍历,依次减一,找到既能被a整除,就能被b整除的最大的数就是最大公约数。

求法2

辗转相除法

例如: 36 28

36%28 =8;

28%8=4;

8%4=0;(余数是0,则4为最大公约数)

通过除于取模的方法,不断地相除直到最后得出0,最后除于的那个数即为最大公约数。

#include
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	while (b != 0)     //余数为b,不等于0时执行,当b=0时,退出,此时的a的值就是最大公约数
	{
		int tmp = a % b;  //引入tmp来进行辗转相除
		a = b;
		b = tmp;
	}
	printf("%d", a);
	return 0;
}

最小公倍数

方法1

给定两个数a,b,最大公约数m,最小公倍数n。

满足: a * b = m * n 的关系。

方法2(for循环)

可以先求出a,b两者的较大值,for循环从i (较大值)开始遍历,直到能够整除a,b,此时最小公倍数就是i。

#include
int main()
{
	int a = 0, b = 0;
	scanf("%d%d", &a, &b);
	int max = a > b ? a : b;//求出较大值赋给max
	for (int i = max;; i++)
	{
		if (i % a == 0 && i % b == 0)
		{
			printf("最小公倍数为%d", i);
			break;//当能整除a和b时,跳出循环,此时的i就是最小公倍数
		}
	}
	return 0;
}

CSDN - 专业开发者社区

你可能感兴趣的:(c语言)