十只老鼠和一千瓶毒药的奇葩故事

时间:2022-05-31 09:52:04

问题描述:有1000个一模一样的瓶子,其中有999瓶是普通的水,有1瓶是毒药。

              任何喝下毒药的生命都会在一天后死亡。现在你只有10只小白鼠和1天的时间,如何检验出哪个瓶子有毒药?

解答:

根据2^10=1024,所以10个老鼠可以确定1000个瓶子具体哪个瓶子有毒。具体实现跟3个老鼠确定8个瓶子原理一样。
000=0
001=1
010=2
011=3
100=4
101=5
110=6
111=7
一位表示一个老鼠,0-7表示8个瓶子。也就是分别将1、3、5、7号瓶子的药混起来给老鼠1吃,2、3、6、7号瓶子的药混起来给老鼠2吃,4、5、6、7号瓶子的药混起来给老鼠3吃,哪个老鼠死了,相应的位标为1。如老鼠1死了、老鼠2没死、老鼠3死了,那么就是101=5号瓶子有毒。
同样道理10个老鼠可以确定1000个瓶子。

步骤如下:

将1千瓶水编上从 1 到 1千的号。

将编号转化成 2 进制数。如 3 就是 11。

将转化成 2 进制数的编号的水分成10组。将所有编号第10位是1的分在第1组,编号第9位是1的分在第2组...编号个位是1的分在第10组。因为 2 的 10 次方是 1024,大于 1千,所以毒药肯定在上面分的若干组中。

将上面10组各组内的水混合。最后形成10瓶水。

给老鼠标编上从 1 到 10的号。标号1的老鼠吃第1组混合的水,标号2的吃第2组混合的,以此类推。

一天后观察结果。老鼠死了记为1,没死记为0。根据观察的结果可以得到类似这样的长度是10的数据: 1(标号1的死了)0(标号2的活着)01001010。 将这个数据转化成 2进制就是毒药的编号。原因是,如果标号为n的老鼠死了,那毒药一定在第n组中,即毒药的编号的2进制数第n位一定是1,否则为0。