【C语言练习】逻辑分析题

news/2024/11/23 2:15:20/

在这里插入图片描述
在这里插入图片描述

目录

  • 题目一:求名次
    • 题目详情:
    • 解题思路:
  • 题目二:找凶手
    • 题目详情:
    • 解题思路:

题目一:求名次

题目详情:


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

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

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

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

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

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

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


解题思路:

 本题的关键在于,如何把上面 555 位运动员说的话转换为编程语言。以A选手说的 “B第二,我第三” 为例,我们可以Y用代码表示成:B==2;A==3 。但是后面又说:“每位选手都说对了一半”。这说明A选手也只说对了一半,也就是说B==2;A==3只有一个是真的,在这里真的用 111 来表示,假的用 000 来表示,因此B==2A==3结果一定等于 111 ,可以用代码表示为:(B==2)+(A==3)==1,但这只表示A选手所说的,五位选手都只说对了一半应该表示为:((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),这就是五个人名次应该满足的条件。此时我们只需要列举出五个人名次的所有情况,然后看哪种情况满足上面的条件。我们可以通过for循环的嵌套来得到五人名词的所有情况。分析的差不多了,接下来上代码

int main()
{int A = 0;int B = 0;int C = 0;int D = 0;int E = 0;for (A = 1; A <= 5; A++)//通过for循环的嵌套得到五人名次的所有可能{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) //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说的{printf("A=%d B=%d C=%d D=%d E=%d\n", A, B, C, D, E);}}}}}}return 0;
}

代码执行结果:
在这里插入图片描述
 这里代码的结果给出了很多种满足条件的名次,但是仔细观察可以发现:有很多组排名都出现了在同一组中一个名次出现了多次,以第一行的结果为例,名次 111 就出现了三次,这显然是不符合要求的。第 1、2、3、4、51、2、3、4、512345 名分别只能被 A、B、C、D、E中的一个占据。因此我们需要添加一个限制条件去除掉同组中一个名次出现多次的这些情况。那这个条件是什么呢?我们不难发现,虽然A、B、C、D、E都应该对应着不同的名次,但都逃不掉是 1、2、3、4、51、2、3、4、512345 其中的一个名次。因此无论A、B、C、D、E五个人的名次如何, A∗B∗C∗D∗EA*B*C*D*EABCDE都逃不掉等于 1∗2∗3∗4∗5=1201*2*3*4*5=12012345=120A*B*C*D*E==120就是我们需要添加的限制条件。修改后的代码如下:

int main()
{int A = 0;int B = 0;int C = 0;int D = 0;int E = 0;for (A = 1; A <= 5; A++)//通过for循环的嵌套得到五人名次的所有可能{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) //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说的{if (A * B * C * D * E == 120)//限制条件:避免一组中同一名次出现多次{printf("A=%d B=%d C=%d D=%d E=%d\n", A, B, C, D, E);}}}}}}}return 0;
}

最终结果
在这里插入图片描述
 此时我们就得到了A、B、C、D、E五个人的名次。

题目二:找凶手

题目详情:


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

以下为4个嫌疑犯的供词:

  • A说:不是我。

  • B说:是C。

  • C说:是D。

  • D说:C在胡说

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

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


解题思路:

 遇到这种问题我们通常都是用假设排除法来解决,依次假设A、B、C、D为凶手,然后看四个人所说的是否满足 333 个真话,111 个假话。例如:先假设 A 为凶手,此时A说的 “ 不是我 ” 就是假话,B说的 “ 是C ” 也是假话,C说的 “ 是D ” 也是假话,D说的 “C在胡说 ” 是真话,此时在假设A是凶手的情况下出现了 333 句假话,111 句真话,不满足题目要求,说明A不是凶手。接下来该假设 B 是凶手了,具体分析就不再赘述。最终我们可以得出 C 是凶手。如何把以上分析过程转化为编程语言是我们现在需要面对的问题
 在上述分析过程中,我们首先对凶手进行了假设,因此在代码中我们首先应该定义一个变量killer用来表示凶手,并且需要让这个变量依次取到 A、B、C、D ,这个简单,可以通过 for 循环来实现,假设完凶手以后,这个凶手需要满足: A、B、C、D 四个人说的话中有 333 句真话,111 句假话这个条件。这个条件用代码可以表示为:(killer!='A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3。分析的差不多了,接下来上代码:

int main()
{char killer = 0;for (killer = 'A'; killer <= 'D'; killer++){if ((killer!='A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)//四句话3真1假,真的用1表示,假的用0表示,所以这四个表达式的最终结果一定等于3{printf("%c\n", killer);}}return 0;
}

最终结果
在这里插入图片描述
 可见最终的凶手就是 C ,这和我们自己分析出来的结果是一样的。

 好了,今天的分享就到这里啦,如果你有更好的思路或者方法,欢迎在评论区或者私信,给我留言,拜拜咯!


在这里插入图片描述


http://www.ppmy.cn/news/21103.html

相关文章

多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch

目录&#xff1a;一、Callable接口Callable的用法小结二、ReentrantLockReentrantLock 的用法ReentrantLock 和 synchronized 的区别&#xff1f;为什么有了 synchronized 还需要 juc(java.util.concurrent) 下的 lock&#xff1f;三、信号量 Semaphore如何理解信号量&#xff…

gma 地理空间绘图:(1)绘制简单的世界地图-1.地图绘制与细节调整

了解 gma gma 是什么&#xff1f; gma 是一个基于 Python 的地理、气象数据快速处理和数据分析函数包&#xff08;Geographic and Meteorological Analysis&#xff0c;gma&#xff09;。gma 网站&#xff1a;地理与气象分析库。 gma 的主要功能有哪些&#xff1f; 气候气象&a…

操作系统(四)--进程的地址空间

目录 一、引言 二、进程的地址空间 ------> 2.1、进程的段 ------> 2.2、查看地址空间 ------------> 2.2.1、静态链接 ------------> 2.2.2、动态链接 ------------> 2.2.3、无名段 ------------> 2.2.4、vdso、vvaar、vsyscall 三、mmap ------&…

第八届蓝桥杯省赛 C++ A/B组 - 分巧克力

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;后缀表达式 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大…

ElasticSearch从入门到出门【上】

文章目录初识elasticsearch了解ESelasticsearch的作用ELK技术栈elasticsearch和lucene为什么不是其他搜索技术&#xff1f;倒排索引正向索引倒排索引正向和倒排ES的一些概念文档和字段索引和映射mysql与elasticsearch安装elasticsearch部署单点es部署kibana安装IK分词器在线安装…

VS搭载Sqlite3用法详解

本篇采用动态库静态调用方式&#xff0c;动态库链接如下https://download.csdn.net/download/u014272404/87406250静态调用方式&#xff1a;1.将Database.dll sqlite3.dll 添加到执行目录中2.在stdafx.h中包含&#xff08;工程目录下&#xff09;#include "Include/DataBa…

Kubernetes考试题(CKA)

CKA题目 每次还原初始化快照后&#xff0c;开机后等5分钟&#xff0c;ssh登录node01&#xff08;11.0.1.112&#xff09;检查一下所有的pod&#xff0c;确保都为Running&#xff0c;再开始练习。 kubectl get pod -A1、权限控制RBAC 问题 设置配置环境&#xff1a; [candi…

Windows10安装java环境

Windows10安装java环境 文章目录Windows10安装java环境下载解压配置下载 Java8 https://www.oracle.com/java/technologies/downloads/#java8-windows Java11 https://www.oracle.com/java/technologies/downloads/#java11-windows Java17 https://www.oracle.com/java/techno…