题目名称:猜名次
内容:
5名运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
下面是ABCDE四名选手的对话:
A选手说:B第二,我第三
B选手说:我第二,E第四
C选手说:我第一,D第二
D选手说:C最后,我第三
E选手说:我第四,A第一
比赛结束后,每位选手都只说对了一半,请编程确定比赛名次。
这题相对于上一篇我们所讲的题目就有点麻烦了,如果我们自己来推的话可能还需要花点时间,但是如果用代码来求,就会简单许多,只是几个for循环和if语句就可以了,那么到底应该怎么写呢?
还是一样,充分利用题目所给的信息:
这题依旧可以用假设法来做,首先假设把名次排出来,例如A是第1,B是第2,C是第3,D是第4,E是第5,总共有五名选手,一人两句话,也就是要写10条判断语句,题目最后一句话所给的信息是,每位选手都只说对了一半,也就是说要把每个人都分出来,当A是第一时,他说的话中只有1句是正确的,也就是两条判断语句的和为1,B也是如此,以此类推,把这些条件写出来放到if语句里面,用&&连接,直到if语句能够执行为止:
#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)//A选手说:B第二,我第三
&& ((B == 2) + (E == 4) == 1)//B选手说:我第二,E第四
&& ((C == 1) + (D == 2) == 1)//C选手说:我第一,D第二
&& ((C == 5) + (D == 3) == 1)//D选手说:C最后,我第三
&& ((E == 4) + (A == 1) == 1))//E选手说:我第四,A第一
printf("A第%d,B第%d,C第%d,D第%d,E第%d\n", A, B, C, D, E);
}
}
}
}
}
return 0;
}
输出结果:
写完之后我们发现,有些结果是不符合题意的,那么我们只需要根据题目的意思,增加一个规定性的条件即可:
因为名次只有1,2,3,4,5五个名次,因此我们规定只有名次的乘积为120(1*2*3*4*5=120)的才能输出。
最终代码:
#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;
}
输出结果:
如果你觉得这道题目对你有所帮助,可以点赞或者关注支持一波哦,持续更新中