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


    题目来自于: 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
    ", ans);
    87         }
    88     }
    89     return 0;
    90 }
    View Code
  • 相关阅读:
    linux性能测试(转)
    mysql基本操作(数据库,表,字段,记录)
    mysql数据库的简介(安装和卸载)
    mysql数据库
    枚举法
    python数据结构与算法简介
    自学心得
    python 进程线程阅读摘抄
    python并发编程多线程基础1
    python队列
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/3940186.html
Copyright © 2020-2023  润新知