zoukankan      html  css  js  c++  java
  • 《转》二进制与三进制的那些趣题

    http://blog.csdn.net/zhuxiaoyang2000/article/details/6091767

    先来思考几个问题,并不难,各位大牛应能秒杀:

    1. 小明是个卖苹果的,小红一次在小明那买N(N<1024)个苹果。小明每次都要数N个苹果给小红,唉,太麻烦了。于是小明想出了一种方法:他把苹果分在10个袋子中,则无论小红来买多少个苹果,则他都可以整袋整袋的拿给小红。问怎样分配苹果到各个袋子?

    2. 有16种溶液,其中有且只有一种是有毒的,这种有毒的溶液与另一种试剂A混合会变色,而其他无毒溶液与A混合不会变色。已知一次实验需要1小时,由于一次混合反应需要使用1个试管,问最少使用多少个试管可以在1小时内识别出有毒溶液?

    3. 27个小球。其中一个比其他小球都要重一点。给你一个天平,最多称3次,找出这个特殊的小球。

    4. 有12个颜色大小一模一样的小球,已知其中只有一只重量有些微差别(提示:但并不知到底是重还是轻哦),现在用一个没有砝码的天平,最多称三次把这个特殊的小球找出来。

    5. 小莫有一个40磅的砝码,一次失手掉到地上,结果摔成了4块,心痛啊。但他却意外的发现这4块砝码碎片可以在天平上称1~40间的任意整数重量了,问4块的重量各是多少?

    6. 将区间 [0,1] 平均分为3段,挖去中间的一段,即去掉 ( 1/3 , 2/3 ) ,然后将剩下的两段同样各自挖去中间1/3 。这样无限挖下去,问区间中[ 0 , 1 ] 中是否有永远不被挖掉的点?如果有,这些点的坐标有什么规律?

    答案在下面,请先思考然后看答案!

    解答: 

      发现错误或有更好解决方法的可留言告诉我,谢谢。第1、2题涉及二进制思想,大家平常都比较熟悉了,算是热热身。后面4题需要用到三进制和所谓的“平衡三进制”思想来解决,挺有趣的。

    问题1 

      答案:按1,2,4,8,16,.......,512

      分析

      第一个问题用二进制编码思想可以轻松解决,相信学计算机的各位不会有什么困难。

      按照二进制编码的特点, n位二进制数的各个数位的权重从低到高分别是2^0  ,2^1 , 2^2 ,…… 2^( n – 1 ) 。  n位无符号二进制数可以表示0到(2^n)- 1 ,共n个数。

      而二进制数位只有1和0两种状态,正好对应题目中苹果袋子的“给”与“不给”两种状态。因此只要将各个袋子分别装入 2^0 , 2^1 , 2^2 , …… , 2^9 个苹果即可满足题目要求。例如:需要66个苹果, 因66的二进制是 1000010 ,则小明只要将苹果个数为2^1(2个) 和2^6(64个)的袋子给小红就可以了。

    问题2 

      答案与分析:

      如果没有1小时的时间限制,那么利用二分搜索的思想既可以解决问题。( 第一次取16种溶液中的8种放入一个试管,然后加入试剂A,看有没有反应,根据结果再进行细分 。 这样只需4个试管,但是需要4个小时 )有了这个1小时的时间限制后这种方法就不管用了。一种正确的解答如下:

      首先,将16种溶液编号为0到15 ,编号的二进制形式表示如下:

    0001

    0010

    0011

    0100

    0101

    0110

    0111

    1000

    1001

    1010

    1011

    1100

    1101

    1110

    1111

      然后,取4个试管,第一个试管加入编号二进制形式中第一位(指最低位)是1的溶液,第二个试管加入编号第二位是1的溶液,其他2个试管分别加入编号第3,4位为1 的溶液。然后再将试剂A加入4个试管中,看那些试管发生了反应,就可以知道有毒溶液的编号了。例如:第1、2、4号试管内发生了反应,则我们知道是第7号溶液是有毒的。原因是7的二进制编码是1011,因此7号溶液是唯一加入了1、2、4号试管,而没有加入3号试管的溶液。

    问题3 

      答案与分析:

      第3个问题可以使用三进制的原理来解决。先说说三进制,与二进制类似,三进制各个数位的权重分别为3^0 ,3^1 , 3^2 ,……., 3^n 。三进制用0 , 1 , 2 这3个数码表示数 ,因此每个三进制数位有3种状态。

    对于每一次天平称量的结果有3种:左边较重、右边较重、平衡。我们可以将左边较重编号为1,右边较重编号为2,平衡编号为0 。

      首先将27个小球按照0到26编号,编号的三进制的形式如下:

    000

    001

    002

    010

    011

    012

    020

    021

    022

    100

    101

    102

    110

    111

    112

    120

    121

    122

    200

    201

    202

    210

    211

    212

    220

    221

    222

      第一称量将编号的三进制第1位为1的小球(9个)放在左边,编号第1位为2的小球(9个)放在右边,编号第1位为0的不放。

      第二次称量将编号的三进制第2位为1的小球(9个)放在左边,编号第2位为2的小球(9个)放在右边,编号第2位为0的不放。

      第三次称量将编号的三进制第3位为1的小球(9个)放在左边,编号第3位为2的小球(9个)放在右边,编号第3位为0的不放。

      好了,根据3次称量的结果,我们就可以知道较重的那个小球的编号了。假设3次称量结果的编号分别为0,1,2 ,那么我们可以知道较重的是21号小球。因为21的三进制是( 210 ) ,因此只有21号小球在第一次称量时没放,第二次放在左边,第三次放在右边。

    问题4 

         答案与分析:

       问题4算是问题3的升级版本吧。

      如果知道异样小球比其他小球轻或重,那么就好办了,只要将12个小球分为4,4,4三堆,称3次是可以找到异样小球的,方法很简单,就啰嗦了。

      但是题目说明不知道异样小球究竟是偏轻还是偏重,上面的方法就不灵了。一种可行的解法如下:

      假设异样小球比正常小球要重,从12个中抽取N个小球出来,包含异常小球的组合总是比不包含异常小球的组合要重。

      将12个小球按编号为3进制的(000)至(102),如下:

    000

    001

    002

    010

    011

    012

    020

    021

    022

    100

    101

    102

      为了方便下面的讨论,先假设异常小球的编号是XYZ,那我们的目标就转化为如何称3次来确定X,Y,Z的值。我们找出异样小球的思路就是,通过称量来不断的缩小范围,最终推理出异常小球的编号。

      注意到编号中最低位为0,为1和2的各有4个。因此将最低位为1与2的分别放在天平两边称一次。根据第一次称的结果分为下面两种情况:

      (1)若第一次称量时天平不平衡,则异样小球必然在编号最低位为1或2的小球中,即Z等于1或2 。

      最低位为1或2的编号有下面8个:

    001

    002

    011

    012

    021

    022

    101

    102

      于是我们就将搜索范围缩小到上面的8个小球中了。

      注意到在这8个数中第二位为1和2的各有2个。就是下面这4个:

    011

    012

    021

    022

      因此第二次称量时,将上面列出的五个数中第二位为1和2的分别放天平两边。

      根据第二次称量的结果,可分为下面两种情况:

      <1>第二次称量时天平不平衡,那么我们可以肯定异样小球必然在第二位编号为1或2的小球中,Y等于1或2 。

        不妨假设小球 011 + 012 >  021 + 022

        假设第一次称量结果是最低位为1的小球比最低位是2的要重,那么我们可以肯定011号小球偏重或022号小球偏轻。

        那么第三次称量只需将011号或022号中任意一个与其他任意一个小球称量,若平衡则是正常小球,否则就是异常小球了。

      <2>第二次称量时天平平衡,则我们可以肯定异常小球编号第二位必然是0 。然后你可以仿照上面的做法通过编号的最高位来找出异常小球的编号。

    (2)若第一次称量时天平平衡,则异样小球编号的最低位必然是0 。同样你可以参考上面的思路通过编号的第2,3位来找到异样小球,这里就不啰嗦了。

      另有这个问题的另一种解法供参考:http://blog.sina.com.cn/s/blog_49d0731a010007i0.html

    问题5 

      答案:1,3,9,27

      分析:

      第5个问题就是所谓“德•梅齐里亚克的砝码问题”(The Weight Problem of Bachet de Meziriac)  。

      这里涉及到所谓“平衡三进制”的问题。平衡三进制,也叫对称三进制,是一种以3为基数,各个三进制位权重为3^0,3^1,3^2…….,3^n ,以 -1,0,1为基本数码的三进制计数体系。n位三进制数表示的范围是 -((3^n) -1)/2 ~ ((3^n) -1)/2 。

      需要明白的是,一个砝码可以放在要称量的物品的同侧,也可以放在对侧,当然也可以不放。砝码的三种状态可以表示为:不放 ( 0 )、放在物品对侧( +1 )、放在物品同侧 ( -1 ) 。

      因此各个砝码碎片的重量就是各个平衡三进制数位的权重( 3^0 , 3^1 , 3^2 , 3^3 ),即 1 , 3 , 9 , 27 。

      总结一下,上面1,2题利用二进制原理解决,而3,4,5题利用三进制原理解决。总的来说原理是一样的,核心的区别在于二进制数位有2种状态,三进制数位有3种状态。 (废话!)

    问题6 

      答案:康拓三分集

      分析

      首先用三进制数表示[0,1]间的小数,并将其画在数轴上。你会发现第一次其实是挖掉了所有小数点后第1位为1的所有数,而第二次则是挖掉了小数点后第2位为1的所有数,按此类推。

      实质上就是挖去了三进制表示法中所有含有数位1的数。因此剩余的数就是[0,1]区间上三进制表示法中不包含1的所有数的集合。这个集合就是所谓的康拓三分集。

      有趣的是:康拓三分集中元素的个数实质上是跟区间[0,1]上的实数个数是一样多的(严格的表述应该是“等势”)!

      若集合A与集合B的元素可以建立一种“一一对应”关系,则我们说A与B“等势”。例如:偶数集E跟自然数集N是等势的,因为对于偶数集中的任何一个数a,都可以在自然数集中找到一个数a/2与之相对应,反之也成立。

      下面来简单证明康拓三分集跟[0,1]区间是等势的。

      首先用二进制表示法来表示[0,1]区间中的小数。

      然后将数位中所有“1”变为“2”,这样在数位上就跟康拓三分集中的一个数完全一致了。反过来,将康拓三分集中的任一个数(二进制表示)中的全部“2”变为“1”,就唯一的对应[0,1]区间的一个二进制小数。因此,康拓三分集与 [0,1]可以建立一一对应关系,因而是等势的。

      整体= 部分。 很神奇吧?一旦到了无穷的领域就会出现很多有趣的东西,例如,你可以证明一小段线段跟一条直线上的点是等势的,完全平方数集合跟自然集是等势的,等等。

  • 相关阅读:
    PHP保留小数的相关方法
    ASP.NET Core MVC 之过滤器(Filter)
    ASP.NET Core MVC 之控制器(Controller)
    ASP.NET Core MVC 之视图组件(View Component)
    ASP.NET Core MVC 之局部视图(Partial Views)
    标签助手(TagHelper)
    ASP.NET Core MVC 之布局(Layout)
    ASP.NET Core MVC 之视图(Views)
    ASP.NET Core MVC 之模型(Model)
    九卷读书:淘宝从小到大的发展 -重读《淘宝技术这十年》
  • 原文地址:https://www.cnblogs.com/yi-meng/p/3967219.html
Copyright © 2011-2022 走看看