2 道很有意思的进制题

本贴最后更新于 2711 天前,其中的信息可能已经物是人非
  1. 一共有 10 只老鼠,1000 只水杯,杯子里都盛着水,只有一个杯中是有毒的液体,这种毒 液老鼠喝下去以后,一个星期就会死掉。现在要求使用这 10 只老鼠,在一个星期之内找出盛着毒液的杯子。

分析一下,这道题目其实是一道和二进制相关的题目。由于只能在一个星期内完成任务,那就说明不能进行重复的实验。这样的话,由于 10 只老鼠在一个星期以后的状态只能是死亡或者存活两种状态,根据乘法原理,我们知道,10 个单位的两种状态,可能出现的所有可能是 2^10 = 1024。足够编码 1000 个杯子了。也就是说,我们现在的任务是把 1000 个杯子 与 10 只老鼠的死和活的组合一一对应起来。如果把 1 到 1000 表示成二进制,那么答案就很明显了。

将 1 到 1000 共一千个数,都转换成二进制编码。对于数字 A,如果它的二进制的最低位 是 1,那么就让 1 号老鼠喝一点这个杯子里的液体,如果是 0 就不喝。A 的二进制的倒数第二低位如果是 1,那么编号为 2 的老鼠就喝,否则不喝。依次类推。直到最高位如果是 1,那么编号为 10 的老鼠就喝,否则该老鼠不喝。一个星期以后观察结果,如果编号为 x 的老鼠死掉 了,那么就从低向高数 x 位,在那个位置上标 1,其他的位置标 0。例如,如果只有 2 号和 4 号 老鼠死掉了,那么记录的结果就是“00 0000 1010”,这样一个二进制数。把它转成十进制是 10,这就意味着 10 号杯子里装的是毒液,其他杯子则是水。

  1. 有一架天平,它有 20 个砝码,这 20 个砝码的重量分别为 1,3,9,27···3^19。只要被称的物品的重量为位于区间 [1,(3^20−1)/2] 的整数,就可以使用这架天平进行称量。假设物品一直放在天平的左边,现在给出每个物品的重量,请打印出称量的方案。输出格式为两组数字,第一组代表天平左边要放的砝码,第二组代表天平右边要放的砝码。这两组数中间用空格隔开。每一组内部的数使用逗号隔开。如果天平的某一边不需要放砝码,那就打印 empty。
    例如,输入是 9,输出是 empty 9,代表左边不需要额外的砝码,而右边需要放一个重量为 9 的砝码。 输入是 4,输出是 empty 1,3。

从最简单的情况入手进行分析。比如说 1,那右边只要放 1 就可以。如果是 2,我们可以用左边放 1,右边放 3 这样的方案代替。3,右边只要放 3。4,右边放 1 和 4。到了 5,由于不能再使用 3-1 去凑一个 2 了,所以唯一的方案是左边放 1,3,右边放 9。同样,6,也只好用 9-3 来凑。我们来分析一下这个规律。

4 的三进制是 11,代表了 1 * 3 ^ 1 + 1,5 的三进制是 12,代表了 1 * 3 ^ 1 + 2 * 3^0,6 的三进制是 20,代表了 2 * 3^1 + 0 * 3^0。由于我们手里的砝码是 3^0, 3^1, 3^2……,也就是说,如果目标数字的各个位置上都是 1,那我们直接就能组合出来,而如果第 n 位上是 2,就必须使用 3^(n+1) - 3^n 来凑这个数。也就是说,我们要在天平的左右两边各加上一个 3^n,才能保持平衡。这样就把低一位上的 2,消除成了高一位上的 1。

好了。有了这个算法,我们就可以写出程序了。

public int[][] solve(int x) {
    int pl = 0, pr = 0;
    int poise = 1, r;
    final int LEFT = 0, RIGHT = 1;
    int[][] result = new int[2][20];

    while (x > 0) {
        r = x % 3;
        if (r == 2) {
            result[LEFT][pl++] = poise;
            x = (x + 1) / 3;
        }   
        else if (r == 1) {
            result[RIGHT][pr++] = poise;
            x = x / 3;
        }
        else
            x = x / 3;

        poise *= 3;
    }

    return result;
}
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 老鼠
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 537 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 609 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 241 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 16 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 375 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    15 引用 • 122 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    133 引用 • 189 回帖 • 1 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖 • 1 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 156 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 550 回帖 • 3 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 3 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 673 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 723 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 95 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 476 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 134 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 597 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 764 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    75 引用 • 1737 回帖 • 1 关注
  • 电影

    这是一个不能说的秘密。

    121 引用 • 601 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    5 引用 • 107 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 361 关注