如何用10只实验鼠检测出1000个药瓶中哪个有毒药
题目
给你 10 只实验小鼠,用 7 天的时间检验 1000 个瓶子中带有一瓶毒药的瓶子是哪一瓶,小鼠喝了毒药 7 天后才会死亡,如何编程实现?
答案
其实这只是一个简单的二进制应用,且听我慢慢道来. 首先我们为所有瓶子进行编号,并将其转换为二进制数. 则第 1000 瓶的编号为 1111101000,为方便理解我们做成表格.
| 第 1 只 | 第 2 只 | 第 3 只 | 第 4 只 | 第 5 只 | 第 6 只 | 第 7 只 | 第 8 只 | 第 9 只 | 第 10 只 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | (0 号瓶子) |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | (1 号瓶子) |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | (2 号瓶子) |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | (3 号瓶子) |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | (4 号瓶子) |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | (5 号瓶子) |
| … | … | … | … | … | … | … | … | … | … | |
| … | … | … | … | … | … | … | … | … | … | |
| … | … | … | … | … | … | … | … | … | … | |
| … | … | … | … | … | … | … | … | … | … | |
| … | … | … | … | … | … | … | … | … | … | |
| 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | (1000 号瓶子) |
从表格我们可以看出这 10 只老鼠可以分别对应到二进制瓶子编号的每一位上,现在我把对应位上值为 1 的瓶子的水喂给对应的老鼠; 比如第 10 只老鼠就需要喝 1、3、5 号瓶子的水,而第 9 只老鼠则要喝 2、3 号瓶子的水.
一个星期后我们就可以开始统计了,这 10 只老鼠的生死分别代表 0 和 1.若对应位的老鼠死了,我记对应位为 1. 这代表对应位数值为 0 的瓶子绝对安全.因为我们这只可怜的小白鼠并没有喝该位为 0 的瓶子的水.
例如:若只有第 9 只老鼠和第 10 只老鼠死了,则我们可以得出一个二进制数值'0000000011’.所以我们可以得出编号 0000000011 的那瓶水便是有毒的水.