5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第一,我第三。
B选手说:我第二,E第四。
C选手说:我第一,D第二。
D选手说:C最后,我第三。
E选手说:我第四,A第一。
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
此题没说没有并列情况,所以我们要考虑到并列第几的情况,也要考虑到跨名次情况(即没有1就有2、3、4、5等)。首先假设D选手说的“C最后”认为为C是第五,然后对于存在并列第几情况的问题,引进二进制。通过将1(0001)移位,再与0(0000)进行或运算,最后判断最终得到的二进制数中有没有0,存在0,则说明有跨名次的情况;不存在0,则得到满足题意正确的比赛名次。
代码如下:
#include<stdio.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; }
时间: 2024-08-06 10:46:37