5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
我们先把这几个人说的话转换成计算机语言
A选手说:B第二,我第三; b == 2 a == 3
B选手说:我第二,E第四; b == 2 e == 4
C选手说:我第一,D第二; c == 1 d == 2
D选手说:C最后,我第三; c == 5 d == 3
E选手说:我第四,A第一; e == 4 a == 1
因为每个人都说对了一半所以把每个人说的话两句加一块并与其他人的并一块
((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)
同时用5个for循环嵌套,把所有的可能性都穷举出来
如下:
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 (((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); } } } } }
我们如果调试一下就会发现结果不唯一。
这是因为当a或b或c或d或e中,如果两个或者三个变量的值相等时,可能也满足判断条件
所以在原有的判断条件上,我们需要再加一条筛选合适的结果。
当a、b、c、d、e分别为5 、 4、 3、 2、 1中的一个值且不能重复时,那么a*b*c*d*e=120。
所以我们添加的条件为
if (a * b * c * d * e == 120) { printf("a是第%d名 b是第%d名 c是第%d名 d是第%d名 e是第%d名\n", a, b, c, d, e); }
代码实现:
#include<stdio.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 (((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)) { 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; }