c 推测题型

例1:

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

A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。

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

数学逻辑:由于只有一个人说了假话,其余人都是真话。

  1. 假设A是嫌疑犯,那么A,B,C均说了假话,假设不成立。
  2. 假设B是嫌疑犯,那么B,C均是假话,假设不成立。
  3. 假设C是嫌疑犯,那么A,B,D说了真话,C说了假话,假设成立
  4. 假设D是嫌疑犯,那么B,D均是假话,假设不成立

综上:嫌疑犯是C

C语言逻辑:

定义一个字符型变量"thisman"用于存放嫌疑犯的名称,嫌疑犯有可能是A,B,C,D四个中的一个,所以用循环来表示:

又已知三个人说了真话,一个人说了假话,所以三个人说的话相加为3即为真;

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	char thisman;     //存放嫌疑人的变量
	for (thisman = 'A'; thisman <= 'D'; thisman++)
	{
		if (((thisman != 'A') + (thisman == 'C') + (thisman == 'D') + (thisman != 'D')) == 3)
			printf("thiman is %c\n", thisman);
	}
	system("pause");
	return 0;
}

代码运行如下:

例2:

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;

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

分析:

程序应满足以下条件:五位选手说的话仅一半正确且名次不相同;

用A,B,C,D,E,表示五位选手,他们均有可能拿第一到第五五个名次,所以应该有五次循环,

代码如下:

#define _CRT_SERCUE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.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 ((A + B + C + D + E == 15) && (A*B*C*D*E == 120)
								&& ((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)
							{
								printf("A:%d B:%d C:%d D:%d E:%d\n", A, B, C, D, E);
							}
					}
				}
			}
	}
}
	system("pause");
	return 0;
}

代码运行如下:

 

 

 

阅读更多

没有更多推荐了,返回首页