老鼠喝药问题--二进制
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; }