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

 

题目来自于: 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

 

你可能感兴趣的:(面试题)