//5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 //A选手说:B第一,我第三。 //B选手说:我第二,E第四。 //C选手说:我第一,D第二。 //D选手说:C最后,我第三。 //E选手说:我第四,A第一。 //比赛结束后,每位选手都说对了一半,请编程肯定比赛的名次。 #include <stdio.h> int main() { int a = 0, b = 0, c = 0, d = 0, 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 == 1) + (a == 3) == 1) && ((b == 2) + (e == 4) == 1) && ((c == 1) + (d == 2) == 1) && ((c == 5) + (d == 3) == 1) && ((e == 4) + (a == 1) == 1)) { int num = 0; num |= (1 << (a - 1)); num |= (1 << (b - 1)); num |= (1 << (c - 1)); num |= (1 << (d - 1)); num |= (1 << (e - 1)); while (num) { if (num % 2 == 0) { break; } num = num / 2; } if (num == 0) { printf("a = %d b = %d c = %d d = %d e = %d\n",a,b,c,d,e); break; } } } } } } } return 0; }
刚开始的时候出来的结果是这样的:c++
发现有不少重复且不现实的结果,听了老师的讲解后再进行了选择判断编程
num|=(1<<(a-1)); num|=(1<<(b-1)); num|=(1<<(c-1)); num|=(1<<(d-1)); num|=(1<<(e-1)); //将num某一位置1 while(num) { if(num%2==0) { break; } num=num/2; //去掉不连续的排名 } if(num==0) { printf("a=%d b=%d c=%d d=%d e=%d \n",a,b,c,d,e); }
由于若是排名是连续的数字的话,它的二进制位从右往左是连续的1,那么它的十进制确定是一个奇数,不断的num%2再除以2.最后的商必定是0;相反,若是排名不是连续的话那么它的某一位确定是有0的,在num%2的时候就直接break了再也不输出。ide
这样就能够去掉不连续的排名了。
spa