c语言期末考试压轴编程题——猜凶手、猜名词、喝汽水、水仙花数

目录

C语言大一期末必考压轴编程题

几道C语言初阶学习必考题,尤其最后一道打印水仙花数,C语言期末考试必备大题,不要错过!!!

以下个人思路仅供参考,如有更优算法,欢迎评论!

目录

一、猜凶手

题目:

题目分析:

代码实现:

二、猜名词

题目:

题目分析:

代码实现:

三、喝汽水

题目:

题目分析:

代码实现:

四、打印水仙花数

题目:

题目分析:

代码实现:


 

一、猜凶手

题目:

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。

以下为4个嫌疑犯的供词:A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

已知3个人说了真话,1个人说的是假话。

现在请根据这些信息,写一个程序来确定到底谁是凶手

题目分析:

三个人说的真话,一个人说的假话——翻译为计算机语言就是,真话为1,假话为0;

所以四句话的条件加起来必定为3,我们用循环让凶手(murder)遍历A、B、C、D四个人时,满足条件的即为凶手

代码实现:

代码如下,仅供参考:

#include<stdio.h>
int main()
{
	char murder = 'A';//定义一个字符型变量murder,假定A是凶手
	for  (murder = 'A'; murder <= 'D'; murder++)
        //字符型变量在内存中是以ASCII码存储的,所以可以for循环累加让凶手遍历A到D的每一位
	{
		if ((murder != 'A') +( murder == 'C') +( murder == 'D') +( murder !=  'D')==3)//三个条件三真一假,和为3
			printf("%c是凶手", murder);
	}
	return 0;
}

二、猜名词

题目:

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一;

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

题目分析:

根据第一题的解决方案,我们可以猜想这个题是不是也需要使用遍历,然后设置满足条件输出呢?

事实也确实是这样,我们使用for循环嵌套,让A到E每位选手都从1遍历到6,然后让满足条件的结果输出;

条件:每位选手都说对了一半,用计算机语言表达就是每位选手的两个条件一个为1,一个为0;即和为1

        需要注意的是,与上题不同,因为仅仅上述条件,满足的排列组合可能不止一种,这个题需要在再加两个个条件,即五个人的名次和为15,积为120

代码实现:

代码如下,仅供参考:

#include<stdio.h>
int main()
{
	int A,B,C,D,E;
	for (A=1;A<6;A++)
	{
		for (B = 1; B < 6; B++)
		{
			for (C = 1; C < 6; C++)
			{
				for (D = 1; D < 6; D++)
				{
					for (E = 1; E < 6; E++)
					{
						if ((B == 2) + (A == 3) == 1 && (B == 2) + (E == 4) == 1 && (C == 1) + (D == 2) == 1 &&
							(C == 5) + (D == 3) == 1 && (E == 4) + (A == 1) == 1 && A*B*C*D*E==120&&A+B+C+D+E==15)
						{
							printf("ABCDE的名次分别是A=%d B=%d C=%d D=%d E=%d",A,B,C,D,E);
						}
					}
				}
			}
		}
	}
	return 0;
}

三、喝汽水

题目:

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水

题目分析:

1、设置变量,简单分析,发现需要设置三个基础变量,空瓶数(bottle)、钱(money)、喝过的可乐计数(i)

2、设计算法:可乐有两种获得方式,一种第一次买的,另一种是换的

      第一步算第一种可乐数,先将所有钱买成可乐,i=money/1;

      第二步算换的瓶数,设计函数将bottle当作参数,计算交换后的瓶数,

            空瓶数为偶数时,交换后的新可乐数就是新的空瓶数;

           空瓶数为奇数时,因为两个瓶子交换一个可乐,所以交换后还剩一个空瓶,交换的新空瓶数需要再加1。

代码实现:

代码入下,仅供参考:

#include<stdio.h>
int jiaohuan(int BOTTLE)//子函数空瓶交换新可乐
{
    int j = 0;
    j = BOTTLE / 2;
    return j;
}
int main()
{
    int bottle = 0;
    int i = 0;
    int money = 20;
    i = money / 1;
    bottle = i;
    while (bottle > 1)         //当空瓶大于1时,就可以继续交换新可乐
    {
        if (bottle % 2 == 0)  //空瓶数为偶数
        {
            int x = 0;             //中间过渡变量,方便接收交换后的空瓶数
            x = jiaohuan(bottle); //调用函数jiaohuan,计算换的新可乐数
            bottle = x;          //刷新空瓶数
            i += x;              //刷新喝过的可乐数
        }
        else                 //空瓶数位奇数
        {
            int y = 0;       //与X相同,都是中间过渡变量
            y = jiaohuan(bottle);
            i += y;
            bottle = y + 1;
        }
    }
    printf("喝了%d瓶可乐", i);
    return 0;
}

四、打印水仙花数

题目:

求出0~100000之间的所有“水仙花数”并输出。

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

题目分析:

本题实现主要三个步骤:

1、遍历1到100000,使用for循环即可

2.提取一个数的每一位数

3.求幂次和,这里需要借助C语言库函数pow();

简单介绍一下,pow( i , j) 的意思就是 i 的 j 次方

需要注意的是,使用pow( )函数,需要加上头文件 #include<math.c>

代码实现:

代码如下,仅供参考:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
	int n = 0;
	int i = 1;
	int j = 0;
	for (n=0;n<100000;n++)
	{
		while (n != (n % i))  //计算当前n为几位数
		{
			i *= 10;
			j++;
		}
		int a = 0;//个位
		int b = 0;//十位
		int c = 0;//以此类推
		int d = 0;
		int e = 0;
		int f = 0;
		if (j >= 1)
		{
			a = n % 10;//a为个位数
			if (j >= 2)
			{
				b = (n % 100 - a) / 10;//十位数...以此类推
				if (j >= 3)
				{
					c=(n%1000-n%100)/100;
					if (j >= 4)
					{
						d = (n % 10000 - n%1000)/1000;
						if (j >= 5)
						{
							e=(n % 100000 - n%10000)/10000;
						}
						else
						{
							f = (n / 100000);
						}
					}
				}

			}
		}
		if (n == (pow(a, j) + pow(b, j) + pow(c,j)+pow(d,j)+pow(e,j)+pow(f,j)))//判断次方和是否等于n自己本身
		{
			printf("%d\n", n);
		}
	}
	return 0;
}

 

 

Guess you like

Origin blog.csdn.net/m0_47646784/article/details/117265317