老鼠喝药问题--二进制

1 问题描述

我们有很多瓶无色的液体,其中有一瓶是毒药,其它都是蒸馏水,实验的小白鼠喝了以后 会在5分钟后死亡,而喝到蒸馏水的小白鼠则一切正常。现在有5只小白鼠,请问一下,我们 用这五只小白鼠,5分钟的时间,能够检测多少瓶液体的成分() a 5瓶 b 6 c 31 d 32

2 分析

用二进制表示,1表示某老鼠喝了某瓶药,0表示某老鼠没有喝了某瓶药

药数量  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
老鼠 5  0 0 0 0 0 0 0 0 0 0  0  0  0  0  0  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  0
老鼠 4  0 0 0 0 0 0 0 1 1 1  1  1  1  1  1  0  0  0  0  0  0  0  0  1  1  1  1  1  1  1  1  0
老鼠 3  0 0 0 1 1 1 1 0 0 0  0  1  1  1  1  0  0  0  0  1  1  1  1  0  0  0  0  1  1  1  1  0
老鼠 2  0 1 1 0 0 1 1 0 0 1  1  0  0  1  1  0  0  1  1  0  0  1  1  0  0  1  1  0  0  1  1  0
老鼠 1  1 0 1 0 1 0 1 0 1 0  1  0  1  0  1  0  1  0  1  0  1  0  1  0  1  0  1  0  1  0  1  0

因此,上面的问题实际上相当于5个手指可以表示多少个数的问题

3 程序实现

# include <stdio.h>
# include <math.h>
int at_apnot; //药的编号
int max;

int main(int argc, char *argv[])
{
    int mid;  //老鼠编号
    int mouse_count; 
    printf("输入老鼠个数为:");
    scanf("%d", &mouse_count);
    max = (int)pow(2, (double)mouse_count); 

    for (mid = 1; mid <= mouse_count; mid++)
    {     
        printf("老鼠 %d 喝:", mid);
        for (at_apnot = 1; at_apnot < max; at_apnot++)
        {
            if (at_apnot & (0x1 << (mid - 1))) //核心算法部分,把2^mouse_count的药
                                               //分别与老鼠所在位为1的数按位相与
                                               //结果为1的就是我们想给老鼠喝得药
                printf(" %d ", at_apnot);
        }
        putchar('\n');
    }

    getchar();
    return 0;
}

Date: 2012-06-17 13:03:52

Author: Crowning

Org version 7.8.11 with Emacs version 23

Validate XHTML 1.0
posted @ 2012-06-17 13:10  csqlwy  阅读(974)  评论(0编辑  收藏  举报