我是靠谱客的博主 平常奇异果,最近开发中收集的这篇文章主要介绍【朝花夕拾C语言】:C语言,猜猜谁是凶手?前言,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

前言

第一道题目:猜猜四个人谁是凶手?

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语言,猜猜谁是凶手?前言所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部