一道面试题,我自己的解法

 

题目来自于: 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不参加,写的很仓促,将就着看下。

 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\n", ans);
87         }
88     }
89     return 0;
90 }
View Code

 

posted @ 2014-08-27 19:42  Anti-Magic  阅读(566)  评论(0编辑  收藏  举报