逻辑推理题的原题描述是这样的:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
分析:
1.首先我们定义五个变量来代表这五个选手:a,b,c,d,e 我们可以确定的是每个运动员的名次都有五种情况,都是1,2,3,4,5。
我们就可以以他们的值来代替他们的名次
2.用程序员的逻辑思维来分析这五个人的描述:
每个选手都说了两句话,每句话都说对了一半,那么每个人都有两种情况,前真后假 或者 前假后真,而每个选手的话都是同时成立的,所以是逻辑与
((b == 2) && (a != 3)) || ((b != 2) && (a ==3))
((b == 2) && (e != 4)) || ((b != 2) && (e ==4))
((c == 1) && (d != 2)) || ((c != 1) && (d==2))
((c == 5) && (d != 3)) || ((c != 5) && (d==3))
((e == 4) && (a != 1)) || ((e != 4) && (a==1))
所以当以上的描述同时成立时,即a,b,c,d,e都有一个值
3.用for循环来判断他们的名次,写完代码后,我们忽略一个问题,那就是他们的名次不能相同,即他们的取值不能相同,在多加一个if条件。
完整代码如下所示
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, b, c, d, e;
for (int a = 1; a <= 5; a++)
{
for (int b = 1; b <= 5; b ++ )
{
for (int c = 1; c <= 5; c++)
{
for (int d = 1; d <= 5; d++)
{
for (int e = 1; e <= 5; e++)
{
if ((((b == 2) && (a != 3)) || ((b != 2) && (a == 3)))
&& (((b == 2) && (e != 4)) || ((b != 2) && (e == 4)))
&& (((c == 1) && (d != 2)) || ((c != 1) && (d == 2)))
&& (((c == 5) && (d != 3)) || ((c != 5) && (d == 3)))
&& (((e == 4) && (a != 1)) || ((e != 4) && (a == 1))))
{
if (a != b && a != c && a != d && a != e && b != c && b != d && b != e && c != d && c != e && d != e)
{
printf("a=%d,b=%d,c=%d,d=%d,e=%d\n", a, b, c, d, e);
printf("A的名次是%d\n", a);
printf("B的名次是%d\n", b);
printf("C的名次是%d\n", c);
printf("D的名次是%d\n", d);
printf("E的名次是%d\n", d);
}
}
}
}
}
}
}
system("pause");
return 0;
}
看着代码,我们很容易就理解了。