找回密码
 立即注册
搜索
总共850条微博

动态微博

查看: 1835|回复: 1
打印 上一主题 下一主题
收起左侧

录像带编号解答

[复制链接]

158

主题

544

帖子

9110

积分

跳转到指定楼层
楼主
发表于 2005-12-1 21:56:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

有一个人,有很多盘录像带。每个录像带买的时候都带有0到9这10个数码(各一个)。他想把所有录像带从一开始用这些数码编号,发现数码不够用,于是改成用16进位,再用上A到F这6个字母,就够用了。他最少有多少录像带?最多有多少?

 

更一般一点,设b是偶数,用b进制,最多可以标多少盘录像带?

 www.ddhw.com

这题实际上是说,什么时候1到n所有的数用到的1的数量超过n?(1总是最先用完。)

 

我们定义两个函数:f(n)是1到n所有的数用到的1的数量,g(n) = f(n) - n。我们要找最小的n使得g(n)大于0。www.ddhw.com

 

首先证明这个n的首位一定是1。如果不是1,是a,则有 n = a*10^k + x,及 g(a*10^k + x) > 0, g(a*10^k) <= 0。而 g(a*10^k + x) - g(a*10^k) = g(x) - g(0) = g(x) > 0。所以这个n不可能是最小的。

 www.ddhw.com

因为首位为1时g(n)是递增函数,我们只需要检查所有的19,199,1999,...,看看什么时候g(n)变成正数,然后就可以倒退回去找到最小的n.

 www.ddhw.com

一般来说,g(2*10^k - 1) = 10^k + 2 * g(10^k - 1) = 10^k + 2 * k*(10^(k-1))。如果要 g(2*10^k - 1) > 2*10^k - 1,则有 2 * k*(10^(k-1)) > 10^k - 1,即 2*k >= 10。所以 k = 5。这时 g(199999) = 1,数下去就会发现 g(199991) = 1 g(199990) = 0www.ddhw.com

 www.ddhw.com

以上论证对所有偶数进位制都有效:设b为偶数,则b进位时最小的 n 使得g(n) > n 的是 2*b^(b/2) - b + 1

 www.ddhw.com

对于一开始的录像带问题,这个人最少有199991盘,最多有1FFFFFFF0 = 8589934576盘。

www.ddhw.com

 
回复

使用道具 举报

213

主题

1162

帖子

1万

积分

沙发
发表于 2005-12-2 14:05:34 | 只看该作者

[@};-][@};-][@};-][@};-][>:D<]


  




回复 支持 反对

使用道具 举报

24小时热帖
    一周热门
      原创摄影
        美食美文
          您需要登录后才可以回帖 登录 | 立即注册

          本版积分规则

          Archiver|手机版|珍珠湾ART

          Powered by Discuz! X3 © 2001-2013 All Rights Reserved