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

news2024/9/22 15:44:12

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

目录

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

题目一:求名次

题目详情:


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

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

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

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

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

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

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


解题思路:

 本题的关键在于,如何把上面 5 5 5 位运动员说的话转换为编程语言。以A选手说的 “B第二,我第三” 为例,我们可以Y用代码表示成:B==2;A==3 。但是后面又说:“每位选手都说对了一半”。这说明A选手也只说对了一半,也就是说B==2;A==3只有一个是真的,在这里真的用 1 1 1 来表示,假的用 0 0 0 来表示,因此B==2A==3结果一定等于 1 1 1 ,可以用代码表示为:(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;
}

代码执行结果:
在这里插入图片描述
 这里代码的结果给出了很多种满足条件的名次,但是仔细观察可以发现:有很多组排名都出现了在同一组中一个名次出现了多次,以第一行的结果为例,名次 1 1 1 就出现了三次,这显然是不符合要求的。第 1 、 2 、 3 、 4 、 5 1、2、3、4、5 12345 名分别只能被 A、B、C、D、E中的一个占据。因此我们需要添加一个限制条件去除掉同组中一个名次出现多次的这些情况。那这个条件是什么呢?我们不难发现,虽然A、B、C、D、E都应该对应着不同的名次,但都逃不掉是 1 、 2 、 3 、 4 、 5 1、2、3、4、5 12345 其中的一个名次。因此无论A、B、C、D、E五个人的名次如何, A ∗ B ∗ C ∗ D ∗ E A*B*C*D*E ABCDE都逃不掉等于 1 ∗ 2 ∗ 3 ∗ 4 ∗ 5 = 120 1*2*3*4*5=120 12345=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为凶手,然后看四个人所说的是否满足 3 3 3 个真话, 1 1 1 个假话。例如:先假设 A 为凶手,此时A说的 “ 不是我 ” 就是假话,B说的 “ 是C ” 也是假话,C说的 “ 是D ” 也是假话,D说的 “C在胡说 ” 是真话,此时在假设A是凶手的情况下出现了 3 3 3 句假话, 1 1 1 句真话,不满足题目要求,说明A不是凶手。接下来该假设 B 是凶手了,具体分析就不再赘述。最终我们可以得出 C 是凶手。如何把以上分析过程转化为编程语言是我们现在需要面对的问题
 在上述分析过程中,我们首先对凶手进行了假设,因此在代码中我们首先应该定义一个变量killer用来表示凶手,并且需要让这个变量依次取到 A、B、C、D ,这个简单,可以通过 for 循环来实现,假设完凶手以后,这个凶手需要满足: A、B、C、D 四个人说的话中有 3 3 3 句真话, 1 1 1 句假话这个条件。这个条件用代码可以表示为:(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.coloradmin.cn/o/188419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(02)Cartographer源码无死角解析-(52) 2D点云扫描匹配→ceres扫描匹配:CeresScanMatcher2D→栅格地图残差

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

上海洲邦携手图扑建设数字孪生工厂,获 2022 智能制造优秀场景

前言 12 月 2 日&#xff0c;工信部公示了 2022 年度智能制造示范工厂揭榜单位和优秀场景名单。图扑软件和上海洲邦合作建设的宁波甬友数字孪生工厂被评为优秀场景&#xff0c;全国共有 369 个智能制造典型场景入选。 《智能制造试点示范行动实施方案》包括智能制造优秀场景和…

ESP-IDF:快速排序测试

ESP-IDF:快速排序测试 /快速排序测试/ void printArray(int arr[], int len) { for (int i 0; i < len; i) { cout << arr[i] << " "; } cout << endl; } void QuickSort(int arr[], int start, int end) { int i start; int j end; // 找…

【IoT】蔽障智能车设计:带有无线调试系统的蔽障小车

说明 近年来随着计算机在社会领域的渗透和大规模集成电路的发展&#xff0c;单片机的应用正在不断地走向深入&#xff0c;由于它具有功能强&#xff0c;体积小&#xff0c;功耗低&#xff0c;价格便宜&#xff0c;工作可靠&#xff0c;使用方便等特点&#xff0c;因此越来越广…

Activiti7工作流-使用idea插件actiBPM设计请假流程---工作流工作笔记005

首先我们看一下我们之前写的测试类, ProcessEngine 这个流程引擎,打开 看源码可以看到有几个常用的, HistoryService就是用来管理之前_hi表的,关于历史的 TaskService用来管理任务的 RuntimeService用来管理_run那些运行时的表的 然后我们还可以通过,上面定义的processEngi…

程序员的成长离不开哪些软技能?

道破一个残忍的真相&#xff1a;一个程序员的成长往往是软技能&#xff1e;硬技能&#xff0c;想纯靠技术能力一路挺过35岁基本是不可能的任务&#xff0c;作为一个优秀的程序员&#xff0c;离不开以下这些软技能。 较真 所有在技术上的较真都是一次专业技能的提升&#xff0…

Ruoyi-Cloud框架学习-【07 新增功能模块】

根据该博客新建模块后&#xff0c;在添加具体的数据表实现增删改查 在ruoyi-cloud中建立数据表 新建business_device表中【与gen_table、gen_table_column在一个库】 CREATE TABLE business_device (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(255) COLLA…

USB转双串口芯片 CH342 兼容替代CP2105

概述CH342是一个USB总线的转接芯片&#xff0c;实现USB转两个异步串口。每个串口都支持高速全双工&#xff0c;支持奇偶校验&#xff0c;提供了常用的MODEM联络信号&#xff0c;用于为计算机扩展异步串口&#xff0c;或者将普通的串口设备或者MCU直接升级到USB总线。特点全速US…

PySpark数据分析基础:核心数据集RDD原理以及操作一文详解(一)

目录 前言 一、RDD概念 二、RDD与DataFrame之间的区别 特性区别 本质区别 三、PySpark中RDD的操作 1.aggregate 2.aggregateByKey 3.map 4.mapPartitions 5.getNumPartitions 6. glom() 点关注&#xff0c;防走丢&#xff0c;如有纰漏之处&#xff0c;请留言指教&am…

< 每日算法 - JavaScript解析:用两个栈实现队列 >

每日算法 - JavaScript解析&#xff1a;用两个栈实现队列一、任务描述&#xff1a;拓展知识二、问题解析三、解决方案&#xff1a;参考文献往期内容 &#x1f4a8;一、任务描述&#xff1a; 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和…

JS扩展运算符(...)的用法

参考链接&#xff1a; 本文可以说是完全抄写的参考链接的内容&#xff0c;本文的目的只用于自己进行记录&#xff0c;加深理解。原文参考链接 一、定义&#xff1a; 扩展运算符(...)是ES6的新增语法&#xff0c;用于取出参数对象中的所有可遍历属性&#xff0c;然后拷贝到当前…

vue移动端适配方案

一、基于rem的适配方案 rem是什么&#xff1f; rem是指相对于根元素的字体大小的单位&#xff0c;在日常开发过程中我们通常把根元素&#xff08;html/body&#xff09;的字体设置为10px,方便于我们计算&#xff08;此时子元素的1rem就相当于10px&#xff09;。 适用场景 不…

开学季,给上小学的孩子送什么比较好?小学生比较实用的礼物

很快来临开学的日子&#xff0c;对于上小学的孩子们&#xff0c;送写学习用具之类&#xff0c;或者是孩子自身喜欢的玩具也可以的&#xff0c;但是因为大部分小朋友在学习时都会眨眼睛&#xff0c;也有些近视的现象了&#xff0c;所以我会选择送护眼的用具比较合适的&#xff0…

DBCO-SS-NHS;CAS NO:1435934-53-4 二苯并环辛炔-二硫键-活性酯,科研实验用试剂

DBCO-SS-活性酯|DBCO-SS-NHS酯 名称;二苯并环辛炔-二硫键-活性酯&#xff1b;DBCO-SS-NHS CAS NO&#xff1a;1435934-53-4 分子量&#xff1a;565.66 分子式&#xff1a;C28H27N3O6S2 含 量&#xff1a;>95% 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊治…

Kettle(三)数据写入错误如何处理?

Kettle作为数据治理工具&#xff0c;总是会涉及到数据的搬迁&#xff0c;在原始数据过大、种类过多时写入肯定会出现一些错误&#xff08;缺少必填项、数据格式错误、主键冲突等等&#xff09;&#xff0c;那么Kettle如何解决&#xff1f;其实Kettle与我们自己写程序的思维不会…

从零开发一个非常有意思的 Python 项目:手势识别

最近开发了一个手势处理的项目&#xff08;零基础也可以学&#xff0c;就是针对零基础的&#xff09;&#xff0c;我在这儿简单的复述一下原理&#xff0c;总体来说还是比较简单的&#xff0c;主要运用的知识就是opencv&#xff0c;python基本语法&#xff0c;图像处理基础知识…

OCR文字识别技术

OCR全称是optical character recognition&#xff0c;中文光学字符识别。主要技术是&#xff1a;把图像形状转变为文本字符。简单来说&#xff0c;OCR技术就是通过图像处理和模式识别技术对光学的字符进行识别&#xff0c;即&#xff0c;对文本资料进行扫描&#xff0c;然后对图…

呕心沥血保姆级Fiddler移动端抓包

本篇文章&#xff0c;博主想使用通俗易懂的话语&#xff0c;让大家明白以下内容&#xff1a;什么是抓包哪些场景需要用到抓包Fiddler抓包的原理怎样使用Fiddler进行移动端抓包抓包包 (Packet) 是TCP/IP协议通信传输中的数据单位&#xff0c;一般也称“数据包”。我们平常测试过…

PCI设备的访问方法_非桥设备(type0)

PCI设备的访问方法_非桥设备(type0) 文章目录PCI设备的访问方法_非桥设备(type0)一、硬件结构二、 PCI本地总线的信号三、 访问PCI设备3.1 怎么访问PCI设备3.1 PCI设备的地址空间3.2 访问PCI设备的步骤3.3 示例&#xff1a;配置PCI Agent设备致谢一、硬件结构 PCI系统框图&…

2023年第七届航空航天、机械与机电工程国际会议(CAMME 2023)

2023年第七届航空航天、机械与机电工程国际会议(CAMME 2023) 重要信息 会议网址&#xff1a;www.camme.org 会议时间&#xff1a;2023年5月26-28日 召开地点&#xff1a;中国西安 截稿时间&#xff1a;2023年4月26日 录用通知&#xff1a;投稿后2周内 收录检索&#xff1a;EI,S…