5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果

A选手说:B第一,我第三。

B选手说:我第二,E第四。

C选手说:我第一,D第二。

D选手说:C最后,我第三。

E选手说:我第四,A第一。

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

    此题没说没有并列情况,所以我们要考虑到并列第几的情况,也要考虑到跨名次情况(即没有1就有2345等)。首先假设D选手说的“C最后”认为为C是第五,然后对于存在并列第几情况的问题,引进二进制。通过将1(0001)移位,再与0(0000)进行或运算,最后判断最终得到的二进制数中有没有0,存在0,则说明有跨名次的情况;不存在0,则得到满足题意正确的比赛名次。

代码如下:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a,b,c,d,e,val,flag;
	for(a=1;a<6;a++)
	{for(b=1;b<6;b++)
		{for(c=1;c<6;c++)
			{for(d=1;d<6;d++)
				{for(e=1;e<6;e++)
					{if((1==(b==1)+(a==3))&&(1==(b==2)+(e==4))&&
					    (1==(c==1)+(d==2))&&(1==(c==5)+(d==3))&&
					    (1==(e==4)+(a==1)))
	/*当a=3;将1(0001)左移2位变为0100(有第三),a再和0000进行或运算(|)就得到0100*/
						{
							val=0;
						    flag=1;
						    val|=(1<<(a-1));
						    val|=(1<<(b-1));
						    val|=(1<<(c-1));
						    val|=(1<<(d-1));
						    val|=(1<<(e-1));
						    while(val)
						    {
						    	if(val%2==0)
							    {
							    	flag=0;
							    }
							    val/=2;
						    }
						    if(flag==1)
						    {
					   printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
						    }
						}   
					}
				}
			}
		}
	}
	system("pause");
	return 0;
}

小游戏:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。

A说:不是我。

B说:是C

C说:是D

D说:C在胡说

已知3个人说了真话,1个人说的是假话。

现在请根据这些信息,写一个程序来确定到底谁是凶手。

代码如下:

#include<stdio.h>
#include<stdlib.h>
 
int main()
{
int killer=0;
for(killer='a';killer<'e';killer++)
{
if(3==(killer!='a')+(killer=='c')+(killer=='d')+(killer!='d'))
/*3人说真话,1人说假话的逻辑表示*/
    {
    printf("killer is %c",killer);
    }
}
   system("pause");
return 0;
}