谁是凶手:

来源:互联网 发布:linux下oracle自启动 编辑:程序博客网 时间:2024/06/11 00:12
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。

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

首先我们分析一下:4个人 1个说谎。当我们判断出谁在说谎,然后4个条件综合肯定能指向一个人,这个人就是凶手(也是说谎的那个人)

我们用“1”表示他是凶手,第一位表示D,第二位表示C,第三位表示B,第四位表示A。即ABCD

则:A说 不是他      可表示为 “0111”  即 ~8

      B说 是C            可表示为 “0010”   即 2

      C说 是D            可表示为 “0001”   即 1

      D说 C在胡说     可表示为 “~C(1110)”

我们依次假设A(BCD)在说谎 

可以得出A在说谎(凶手)


下来我们用C语言来完成找凶手:

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int main(){int A = ~8;int B = 2;int C = 1;int D = ~C;if((1==((~A)&B&C&D))||(2==((~A)&B&C&D))||(4==((~A)&B&C&D))||(8==((~A)&B&C&D))){printf("A说谎(凶手)\n");}if((1==(A&(~B)&C&D))||(2==(A&(~B)&C&D))||(4==(A&(~B)&C&D))||(8==(A&(~B)&C&D))){printf("B说谎(凶手)\n");}if((1==(A&B&(~C)&D))||(2==(A&B&(~C)&D))||(4==(A&B&(~C)&D))||(8==(A&B&(~C)&D))){printf("C说谎(凶手)\n");}if((1==(A&B&C&(~D)))||(2==(A&B&C&(~D)))||(4==(A&B&C&(~D)))||(8==(A&B&C&(~D)))){printf("D说谎(凶手)\n");}return 0;}







1 0