5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第一,我第三。
B选手说:我第二,E第四。
C选手说:我第一,D第二。
D选手说:C最后,我第三。
E选手说:我第四,A第一。
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
这个题当我们第一次看到的时候会懵,但是C里就会显得很简单。
最起码看到题我们就可以利用for循环确定总共有多少种可能。
然后根据已知条件,每位选手都说对了一半,
只要假设每个人说对了一半,把所有的可能都用if语句罗列出来。
注意:满足一个人说的条件以后,要在满足这个人条件的基础上在满足另一个人的条件就用到了嵌套。
(在下面的示例中,为了把代码直观化,把if嵌套的括弧给去掉了。for循环嵌套的括弧没有删掉)
最后我们直接给一个输出,让计算机自己去判断!
这就是这道题的大体思路。
程序如下:
#include <stdio.h>
#include <windows.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
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 ((1 == b && 3 != a) || (1 != b && 3 == a) == 1)
if ((2 == b && 4 != e) || (2 != b && 4 == e) == 1)
if ((1 == c && 2 != d) || (1 != c && 2 == d) == 1)
if ((5 == c && 3 != d) || (5 != c && 3 == d) == 1)
if ((4 == e && 1 != a) || (4 != e && 1 == a) == 1)//意思是说他们每个人只对了一半
{
int ret = 0;
ret |= (1 << (a - 1));//排名次不能少了某一个名次,比如11235,就少了第四名
//所以说我们在这里利用二进制数的低四位,也就是15
//如果a是第一名,就在最后一位上补1,假如d是第四名,就在倒数第四位上补1
ret |= (1 << (b - 1));
ret |= (1 << (c - 1));
ret |= (1 << (d - 1));
ret |= (1 << (e - 1));
while (ret) //判断这个二进制数是不是15
{
if (ret % 2 == 0)
{
break;
}
ret /= 2;
}
if (ret == 0)//到这里我们的结果就出来了
{
printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
}
}
}
}
}
}
}
system("pause");
return 0;
}
程序运行结果: