有3只老鼠和8瓶水的问题

稿件来源: 阳光企业网站管理系统   撰稿作者: 太阳光   发表日期: 2016-11-07   阅读次数: 52   查看权限: 游客查看

有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

  • 感到高兴

    8

    高兴
  • 感到支持

    8

    支持
  • 感到搞笑

    8

    搞笑
  • 感到不解

    8

    不解
  • 感到谎言

    8

    谎言
  • 感到枪稿

    8

    枪稿
  • 感到震惊

    8

    震惊
  • 感到无奈

    8

    无奈
  • 感到无聊

    8

    无聊
  • 感到反对

    8

    反对
  • 感到愤怒

    8

    愤怒
55.56%(10)
44.44%(8)
共有0 条评论 发言请遵守【相关规定

网友评论

会员头像
发 表同步腾讯微博  匿名评论  验证码:  点击更新
  • 暂无评论
关闭模块文章图片 article Pictrue
  • 代码覆盖率工具 Istanbul 入门教程
  • 全栈工程师的武器——MEAN
  • 9款超炫的 CSS3 复选框(Checkbox)
  • 微信开发在线翻译功能
  • CSS3那些不为人知的高级属性
  • 给easyui的datebox添加清空事件
  • flash写字效果
  • kendoUI系列教程之DropDownList下拉菜单
  • kendoUI系列教程之datetimepicker日期时间选择
  • kendoUI系列教程之datepicker日期选择
  • kendoUI系列教程之combobox下拉列表框
  • kendoUI系列教程之colorpicker
  • kendoUI系列教程之calendar日历表
  • kendoUI系列教程之autocomplete自动补齐
  • kendo ui简介
  • QQ登录网站实战教程