【二进制】记录一道有趣的题

235 阅读2分钟

题目

现在有 10 只小白鼠和 1000 支药水,1000 支药水中有且仅有一支药水有毒,毒发的时间是两小时

现在有两小时的时间,请问如何用这 10 只小白鼠测出哪支药水有毒?(忽略喝药的时间,每支药水量充足)。

提示

10 如何能代表 1000

解答

  1. 10 只小白鼠,我们分别给它们编号,从 0-9。

  2. 每只老鼠喝下药水,最终的结果要么是生,要么是死,所以有两种状态——就是二进制的 0 和 1。

  3. 每只小白鼠有两种状态,那么 10 只小白鼠联合起来,2 的 10 次方是 1024,当然可以表示 1000 个数字了。

  4. 然后我们给每只药水编号,从 0-999:

    0 二进制表示,是 0000000000

    1 二进制表示,是 0000000001

    2 二进制表示,是 0000000010

    ..........

    999 二进制表示,是 1111100111

  5. 可以看到我把药水编号转成二进制,一共写了 10 位,每一位其实就表示对应一只小白鼠喝不喝这个药水

    就是说第 0 个小白鼠,把药水编号第 0 位是 1 的药水都喝一遍。

    第 1 个小白鼠,把药水编号第 1 位是 1 的药水都喝一遍。

    第 2 个小白鼠,把药水编号第 2 位是 1 的药水都喝一遍。

    ...

    第 9 个小白鼠,把药水编号第 9 位是 1 的药水都喝一遍。

  6. 这样设计之后,除了第 0 瓶药水,其它药水都有小白鼠喝了,所以如果没有小白鼠死亡,那么第 0 号药水有毒。

  7. 如果有小白鼠死亡(假设现在是编号 3 的药水有毒),我们得知编号 3 的二进制是:0000000011。从上面的规则我们知道,有且仅有第 0 个和第 1 个老鼠喝了编号 3 这个药水,所以如果别的老鼠都没死,只有这两个老鼠死了,那么我们可以断定编号 3 药水是毒药。

  8. 所以,我们让对应的老鼠喝对应的药水,然后两小时之后观察哪几只老鼠死亡,我们就可以从死亡的老鼠编号反推出毒药的编号。

  9. 假设现在第 0、1、3、5 老鼠死了,那么毒药水编号就是:2^0 + 2^1 + 2^3 + 2^5 = 1 + 2 + 8 + 32 = 43。