【C语言走进现实】猜凶手

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

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


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


A说:不是我。


B说:是C。


C说:是D。


D说:C在胡说


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


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


我相信大家肯定在做数学卷子时碰见过这道题,而大家一般的解题思路就是分析假设(如下)


当A是凶手时:


       A说的是假话、B说的是假话、C说的是假话、D说的是真话


当B是凶手时:


       A说的是真话、B说的是假话、C说的是假话、D说的是真话


当C是凶手时:


       A说的是真话、B说的是真话、C说的是假话、D说的是真话


当D是凶手时:


       A说的是真话、B说的是假话、C说的是真话、D说的是假话


由以上分析可得,C是凶手


但是问题来了,我们怎么将上述分析转化成编程呢?


假设凶手是killer,那么killer = ‘A’或‘B’或‘C’或‘D’。


那killer是不是就可以作为循环变量,取值范围为字符A、字符B、字符C、字符D

假设killer是A         假设killer是B         .....         假设killer是D

现在我们把每个人的说法转换成表达式,然后在循环内把表达式的值加起来,


如果值等于三那么就打印该字符,不等于3就跳过


(三句真话一句假话,就是 1、1、1、0)


A说:不是我。 killer != 'A'


B说:是C。 killer == 'C'


C说:是D。 killer == 'D'


D说:C在胡说 killer != 'D'


拓展:


       当一个表达式为真时,该表达式返回值为1


例:表达式的值为 1、10、-1 等不为零的数值,表达式为真


       当一个表达式为假时,该表达式返回值为0


代码实现:

#include<stdio.h>
int main()
{
  int killer = 0;
  for (killer = 'A'; killer <= 'D'; killer++)
  {
  if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
  {
    printf("凶手是:%c", killer);
  }
  }
  return 0;
}


相关文章
|
C语言
用C语言解决实际问题之买汽水、猜凶手(名次)
用C语言解决实际问题之买汽水、猜凶手(名次)
94 0
|
7月前
|
C语言
C语言第四十七弹---猜凶手
C语言第四十七弹---猜凶手
|
存储 算法 C语言
【C语言刷题】猜名次、猜凶手、杨辉三角、杨氏矩阵、字符串左旋、判断是否为左旋子串
【C语言刷题】猜名次、猜凶手、杨辉三角、杨氏矩阵、字符串左旋、判断是否为左旋子串
82 0
|
C语言
【C语言练习】求名次、找凶手
【C语言练习】求名次、找凶手
83 0
|
C语言
C语言:猜凶手
题目: 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说:不是我。 B说:是C。 C说:是D。
110 0
|
C语言
C语言经典问题—猜名次、猜凶手和杨辉三角
C语言经典问题—猜名次、猜凶手和杨辉三角
72 0
|
算法 C语言 C++
【C语言每日一题】——猜凶手
猜凶手🙌 题目内容 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。
192 0
|
C语言
C语言题解:谁是凶手!
C语言题解:谁是凶手!
256 0
C语言题解:谁是凶手!
|
C语言
C语言解决 猜凶手问题 两句话矛盾必有一真一假类问题
C语言解决 猜凶手问题 两句话矛盾必有一真一假类问题
118 0
C语言解决 猜凶手问题 两句话矛盾必有一真一假类问题