题目来自于: http://www.cnblogs.com/humble/p/3937667.html
本博客地址:http://www.cnblogs.com/wolfred7464/p/3940186.html
第一题:
A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
人参加了竞赛:
(1)A参加时,B也参加;
(2)B和C只有一个人参加;
(3)C和D或者都参加,或者都不参加;
(4)D和E中至少有一个人参加;
(5)如果E参加,那么A和D也都参加。
只有 ABCDE 5个人,所以最多只有 2^5 = 32 种情况,枚举所有情况然后判断是否合法就可以了。
用5位二进制数表示答案ans,从低到高依次是ABCDE。即ABCDE分别是1,2,4,8,16。所以判断A参加只要 ans & a == a 就可以了。
写10个函数,分别表示每个人参加和不参加两种情况。
代码是用C语言写的,A()表示A参加,rA()表示A不参加,写的很仓促,将就着看下。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 3 const int a = 1; 4 const int b = 2; 5 const int c = 4; 6 const int d = 8; 7 const int e = 16; 8 9 int ans = 0; 10 11 int A() 12 { 13 return (ans & b) == b; 14 } 15 16 int rA() 17 { 18 return 1; 19 } 20 21 int B() 22 { 23 return (ans & c) == 0; 24 } 25 26 int rB() 27 { 28 return 1; 29 } 30 31 int C() 32 { 33 return (ans & b) == 0 && (ans & d) == d; 34 } 35 36 int rC() 37 { 38 return (ans & d) == 0; 39 } 40 41 int D() 42 { 43 return C(); 44 } 45 46 int rD() 47 { 48 return (ans & e) == e; 49 } 50 51 int E() 52 { 53 return (ans & a) == a && (ans & d) == d; 54 } 55 56 int rE() 57 { 58 return (ans & d) == d; 59 } 60 61 int main() 62 { 63 for (ans = 0; ans <= 31; ans++) { //31就是2进制的11111 64 int leg = 0; 65 for (int i = 0; i < 5; i++) { 66 int flag = ans & (1 << i); 67 switch (i) { 68 case 0: 69 leg += (flag ? A() : rA()); 70 break; 71 case 1: 72 leg += (flag ? B() : rB()); 73 break; 74 case 2: 75 leg += (flag ? C() : rC()); 76 break; 77 case 3: 78 leg += (flag ? D() : rD()); 79 break; 80 case 4: 81 leg += (flag ? E() : rE()); 82 break; 83 } 84 } 85 if (leg == 5) { 86 printf("%d ", ans); 87 } 88 } 89 return 0; 90 }