A选手说:B第二,我第三; |
B选手说:我第二,E第四; |
C选手说:我第一,D第二; |
D选手说:C最后,我第三; |
E选手说:我第四,A第一; |
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
分析:
本题考查的是将现实问题代码化的能力。
A说B第二,我第三,代码化为B==2,A==3;
B说我第二,E第四,代码化为B==2,E==4;
下面以此类推;
每位选手都说对了一半,代码化为判断之和为1;
以A为例:
(B==2)+(A==3)== 1;(个人认为这是这道题的精髓)
判断为真返回1;判断为假返回0;说对一半则要么B==2为真,要么A==3为真;
代码核心思想:穷举法
瑕疵代码展示:
#include<stdio.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 (((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);
}
}
}
}
}
}
return 0;
}
运行结果:
运行结果会有很多排名重复,所以需要再加判断进行限制输出;
我的思路:
因为排名只有1,2,3,4,5,其和与积为定值,即用a+b+c+d+e==15&&a*b*c*d*e==120进行限制
完整代码展示:
#include<stdio.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 (((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 == 15 && 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;
}
运行展示:
注释:本人新手,如有更优解请在评论区多指教。