预测名次

版权声明:盗版必究 https://blog.csdn.net/qq_42837885/article/details/88743442

问题描述

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;
  } 

猜你喜欢

转载自blog.csdn.net/qq_42837885/article/details/88743442