概述
文章目录
前言
第一道题目:猜猜四个人谁是凶手?
1.1题目简介
1.2分析逻辑
1.3代码实现
第二道题目:判断五个人的名次
2.1 题目简介
2.2分析逻辑
2.3代码实现
总结
前言
距离上次写博客已经过去了好久,本想一个星期里面:周一到周六好好学习知识点,然后周末的时候进行复盘,却总是惰性十足哎!!!想着周一或者周二进行弥补,结果又跑去刷题了,今天已经周三了,不能再往后拖了,学而不思则罔,有些值得记录的东西,要在成长的路上,当作自己前进的阶梯,加油,滕飞!
第一道题目:猜猜四个人谁是凶手?
1.1题目简介
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
1.2分析逻辑
对于没有做过类似题目的同学肯定和我一样,第一次看见这道题,可能有点发懵。
但是这道题的代码结果会让你大吃一惊,当时看完代码后,脑子里面就出现了:竟然还可以这样玩???真是太让人惊讶了............
首先,要考虑的是如何用代码表示A,B,C,D这四个人说的话?我们定义一个int变量k来表示凶手。
最能想到的就是如果某个人说的话是成立的话,将他的结果为1(类似于bool类型),否则就是0。这样的想法是正确的。
A说:不是A,那么,可以表示为k!= ‘A’。判断成立的话,他就会返回1,否则,返回0。类似的,其他3个人说的话也可以这样来表示。
最后,根据3个人说了真话,1个人说了假话得知返回的总和为3。比如,我们假设A就是凶手,那么根据四个人说的话,A说了假话,B也说了假话,和条件是不符合的。这样之后,只是判断了A的情况,B,C,D的情况还没有判断,只需要加一个循环就可以了。
1.3代码实现
其代码实现如下:
#include <stdio.h>
//猜凶手啊!!
int main()
{
//还能这样玩啊!
int k;
for (k = 'a'; k <= 'd';k++)
{
if (((k != 'a') + (k == 'c') + (k == 'd') + (k != 'd'))==3)
{
printf("k=%cn", k);
}
}
return 0;
}
跑完上面的代码后,结果如下所示:k=c 则显示的结果是c是说谎了,是凶手!
第二道题目:判断五个人的名次
2.1 题目简介
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
2.2分析逻辑
和上面的第一题的逻辑一样,我们将一个人说的话这样定义:
比如说A说:B第二,我第三定义为:(b==2&&a==3),同理其他的我们也是按照这种的标准进行相应定义,最后要进行并列才能满足条件:
((b == 2) + (a == 3) == 1) && A说的信息
((b == 2) + (e == 4) == 1) && B说的信息
((c == 1) + (d == 2) == 1) && C说的信息
((c == 5) + (d == 3) == 1) && D说的信息
((e == 4) + (a == 1) == 1) E说的信息
你以为这样就好了嘛?还远远不够,还要加上一个限制条件:
a * b * c * d * e == 120
就是a b c d e的代码名次相乘要等于120,不然会出现下列这种情况,很多不满足的!
a=1 b=2 c=1 d=3 e=1
a=1 b=2 c=1 d=3 e=2
a=1 b=2 c=1 d=3 e=3
a=1 b=2 c=1 d=3 e=5
a=1 b=2 c=5 d=2 e=1
a=1 b=2 c=5 d=2 e=2
a=1 b=2 c=5 d=2 e=3
a=1 b=2 c=5 d=2 e=5
a=3 b=1 c=1 d=3 e=4
a=3 b=1 c=5 d=2 e=4
a=3 b=3 c=1 d=3 e=4
a=3 b=3 c=5 d=2 e=4
a=3 b=4 c=1 d=3 e=4
a=3 b=4 c=5 d=2 e=4
a=3 b=5 c=1 d=3 e=4
a=3 b=5 c=5 d=2 e=4
显然,这种情况里面有很多是不满足的,当我们加上限制条件后,就会得到想要的结果了!
2.3代码实现
#include <stdio.h>
#include <string.h>
int main()
{
int a, b, c, d, e;
for (a = 1; a <= 5; a++)
{
for (b = 1; b <= 5; b++)
{
for (c = 1; c <= 5; c++)
{
for (d = 1; d <= 5; d++)
{
for (e = 1; e <= 5; 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)
)
{
if (a * b * c * d * e == 120)
printf("a=%d b=%d c=%d d=%d e=%dn", a, b, c, d, e);
}
}
}
}
}
}
return 0;
}
最后的结果是:a=3 b=1 c=5 d=2 e=4
总结:
两道题目,都给了我们不同的考虑思路,让人眼前一亮,确实不得不佩服想到这种想法的人,真是脑洞大开,从中也是学到了好多知识!
最后
以上就是平常奇异果为你收集整理的【朝花夕拾C语言】:C语言,猜猜谁是凶手?前言的全部内容,希望文章能够帮你解决【朝花夕拾C语言】:C语言,猜猜谁是凶手?前言所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复