关闭

一个程序员都应该熟悉的故事

标签: c语言程序员二进制计算机编码
158人阅读 评论(0) 收藏 举报
分类:

首先读者必须原谅作者把有意思的题目看做故事。。。。。害羞

有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

上面的题目熟悉的读者应该不太少,网上分析的也有,但是鉴于作者接触的第一个C语言问题就是他,而作者所接触的第一个技术领域就是C语言,所以以这个故事开始还是颇有意义的,好,让我们正式开始。

首先,我想问读者,这里小白鼠的数量是随便给的吗?恩,我听到了,当然不是!我们可以简单算一下,便知道1000转换为二进制为1111101000(十位)。我们如果对每一个瓶子都按二进制进行编码,可知顺序为0000000001-1111101000,然后我们再让小白鼠排成一行,共十排(见下图),我们这样规定如果哪个瓶子哪个位为1,就让对应排的小白鼠喝它。比如第1000瓶为1111101000那就让第1,2,3,4,5,7排的老鼠去喝它,第888瓶为1101111000那就让第1,24,5,6,7排的老鼠去喝它。我们让这样的操作对1000个瓶子都做一遍。


然后,就等咯。。。

一星期以后,可怜的小白鼠就开始死亡了,我们可以从他的死亡行数,比如第2,5,6,7,8行小白鼠死了,我们可以知道一定是第79号瓶子害的(第一次看的话,需要想一会才能理解原因,想想他们的对应性,而且这种对应性绝不会重复生气)。


我们可以从中得到些什么启发呢?首先小白鼠很可怜,然后就是二进制的魅力咯,还记得作者刚开始接触计算机领域时,就曾经怨恨过,计算机采用二进制编码的复杂性,但是随着学习的深入,才逐渐发现先人的智慧,的确大有可取之处。在这题中我们可以知道虽然瓶子的数量较多,有1000个,然而把他们用二进制排列,只需要十位就可以不重复了,想来也是一件十分神奇的事情(如果题目没有给出小白鼠的数目,只提到要用最少的小白鼠数目,找出带毒瓶,你会想到需要多少小白鼠呢,作者当年想到的是999只,是不是很白痴大笑)。


注:以上内容,纯属作者所想,如有雷同,纯属致敬,若广大读者有更好的表述看法或发现了文章内的错误,敬请指教微笑


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2147次
    • 积分:63
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档