问题描述
A,B,C,D,E 5人为某次竞赛的前五名,他们在名次公布前猜名次。
A说;B得第三名,C得第五名。
B说;D得第二名,E得第四名。
C说;B得第一名,E得第四名。
D说;C得第一名,B得第二名。
E说;D得第二名,A得第三名。
结果每个人都猜对了一半,实际名次是什么呢?
算法设计与分析
可以用四层for循环代表四个人名次的可能性,第五个人的名次等于15减去前四个人名次的和,因为1+2+3+4+5=15,且五个人的名次不能出现相同的,当五个人的名次满足题目的要求时即是正确名次,难点在于如何将题目所给的信息数字化。
因为每个人都只猜对了一半,即两条语句中一个为真,一个为假,我们知道在C语言中逻辑值为真值为1,即每个人的两条语句逻辑值的和等于1,如下;
(b==3)+(c==5)==1
(d==2)+(e==4)==1
(b==1)+(e==4)==1
(c==1)+(b==2)==1
(d==2)+(a==3)==1
思考
此题运用了C语言逻辑值可以相加,而在java中逻辑值不可以相加,这时可以运用异或来解决此问题
代码
#include<stdio.h>
int main()
{
int a,b,c,d,e;
for(a=1;a<=5;a++)
{
for(b=1;b<=5;b++)
{
if(a!=b)
for(c=1;c<=5;c++)
{
if(c!=a&&c!=b)
for(d=1;d<=5;d++)
{
if(d!=a&&d!=b&&d!=c)
{
e=15-a-b-c-d;
if((b==3)+(c==5)==1&&(d==2)+(e==4)==1&&(b==1)+(e==4)==1&&(c==1)+(b==2)==1&&(d==2)+(a==3)==1)
printf("A%d B%d C%d D%d E%d\n",a,b,c,d,e);
}
}
}
}
}
return 0;
}