c语言期末考试压轴编程题——猜凶手猜名词喝汽水水仙花数
Posted better,faster
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
以上是关于c语言期末考试压轴编程题——猜凶手猜名词喝汽水水仙花数的主要内容,如果未能解决你的问题,请参考以下文章