文章分类 Classification
有3只老鼠和8瓶水的问题
稿件来源: 阳光企业网站管理系统 撰稿作者: 太阳光 发表日期: 2016-11-07 阅读次数: 477 查看权限: 游客查看
有3只老鼠和8瓶水的问题
有3只老鼠,8瓶水,其中一个有——喝到有毒的水之后,老鼠一周后会准时死亡。请用编程找出哪个瓶子有毒。
给瓶子编号0-7,并把编号翻译成二进制串,刚好可以用三位二进制来表示。让三只老鼠分别对应三位二进制,然后形成如下交叉表:
老鼠1 老鼠2 老鼠3
0 = 0 0 0
1 = 0 0 1
2 = 0 1 0
3 = 0 1 1
4 = 1 0 0
5 = 1 0 1
6 = 1 1 0
7 = 1 1 1
其中二进制位为1的地方表示哪只老鼠吃哪瓶药。即:
老鼠1应该喝4,5,6,7号的药;
老鼠2应该喝2,3,6,7号的药;
老鼠3应该喝1,3,5,7号的药。
最后观察的时候,可以根据老鼠死了的情况,0表示没死,1表示死了。
比如三只老鼠死了的情况是(1,0,1)则表示5号药是有毒的。因为只有这种情况下才会导致老鼠1和老鼠3死掉。
题目后来升级到:假如有1000瓶水,只有一瓶是有毒药的,请问需要多少只老鼠来做实验?
答案是十只,也就是说10位二进制最大能表示1024个数字(从0开始算起)
<script type="text/javascript"> function count(bottle){ if(bottle < 2){return alert("瓶子太少了")} const obj = { needMouse : 1, dieMouse : [], drinkArray : [], poison : Math.floor(Math.random() * bottle), number : 0 }; for(let i = 0;;){ if(Math.pow(2,i++) < bottle && bottle <= Math.pow(2,i)){ obj.needMouse = i; break; } } for(let i = 1;i < bottle;i += 2){ for(let l = obj.needMouse;l--;){ let power = Math.pow(2,l); for(let k = 0;k < power;k ++){ let _t = power * i + k; if(_t < bottle){ !obj.drinkArray[l] && (obj.drinkArray[l]=[]); obj.drinkArray[l].push(_t == obj.poison ? `<span>${_t}</span>` : _t); if(_t == obj.poison){ obj.dieMouse.push(l); obj.number += power; } } } } } document.write(JSON.stringify(obj,function(key,value){ switch (key){ case "needMouse": return `需要${value}只老鼠做实验`; case "dieMouse": return `中毒死的老鼠编号:${value.reverse().join("号,")}号`; case "drinkArray": let str = `<br/>`; for(let i = 0;i < value.length;i++){ str += `第${i}号老鼠喝:${value[i].join(',').replace(/<span>/g,"<span style='color:red'>")}号;<br/>`; } return str; case "poison": return `随机有毒的瓶子:${value}号`; case "number": return `计算出有毒的瓶子:${value}号`; } return value; },"<br/>")); } let n = prompt("请输入瓶子数量:",""); !isNaN(n) && count(n); </script>
关键词: 面试题,3只老鼠 编辑时间: 2016-11-07 10:34:12
9
高兴9
支持9
搞笑9
不解9
谎言9
枪稿9
震惊9
无奈9
无聊9
反对9
愤怒
55%(11)
45%(9)
- 中搜索:有3只老鼠和8瓶水的问题
- 中搜索:有3只老鼠和8瓶水的问题
- 暂无评论
文章图片 article Pictrue
网友评论