也谈 创新工厂面试题详解:共打了多少鱼

在首页上看到这篇文章http://blog.csdn.net/nokiaguy/article/details/6800209 ,所以想了想这道题。


刚看到题目想到的就是枚举,不知道这算是程序员的通病还是像我这种低阶程序员的通病。但是想到了中国剩余定理这么个东西,又回头看了一下,得到点灵感,当然其实感觉下面的算法和这个东西关系已经不大了。下面是具体思路:

先从e开始,假设e不需要满足有上面 a b c 的分鱼过程继承下来的限制条件,那么e中鱼的总数 x 只需要满足两个条件:

x mod 5 = 1

x mod 4 = 0 

如果直观来看,非常简单,最小的 x = 16。但是得到在编程方面的可靠性,这里提供一个非常简单同时非常有局限性的算法,我们不妨称为算法1。

题目原型是:

x mod 5 = t

x mod 4 = 0

求最小的x   那么算法1就是  x = 4*(5 - t)


下面引出一个结论(可证,但未写证明工程,非常显而易见),称为结论1


x mod m1 = t

x mod m2 = 0

则,所有满足条件的 x , 按递增排序组成一个等差数列,且等差为 m1与m2的最小公倍数


回到题目(每一次算出的结果都只考虑当前状况与上一次分鱼工程对本次的影响):

e:

        上面算出值满足条件 e 时,在状况e中,鱼的总数为 e = 16

d :

那么当回到状况d 时,由于 e =16 ,所以  d = 16 / 4 *5 +1 = 21

显然这个数目不满足条件 d , 因为状况 d 中由于分鱼过程 c 的影响,鱼的数目也需要也需要满足 d mod 4 = 0,所以需要对此结果做修正

由结论1知道,所有满足条件e 的鱼的数目组成的等差数列的等差为 4 与 5 的最小公倍数为 20,所以 d 中的修正因子为 20 / 4 * 5 = 25

又由于当前 (d=21) mod 4 = 1,所以修正因子 t ,必须满足一下条件

t mod 4 = 3

t mod 25 = 0

显然最小的 t 为 75。

所以 d = 21 + 75 = 96。且所有满足条件的 d 组成的等差数列的等差为 25 * 4 = 100


为了引出下面的递归运算,引入结论2:

题目原型:

x mod 4 = z

x mod y = 0

且 y 为 5 的 n 次方,则最小的 x  =  y * z


对d中的求解方法做一个总结,作为可作为有限次分鱼的递归条件。

条件:上一步得出的最小的鱼的数目,我们称为 a 。 所有满足上一步条件的鱼的数目组成的等差数列的等差我们称为 b ,且b = 4  * 5^n (n为从后往前一进行的分鱼次数)。

结论:则 这一步得到的基础数值为 c = a / 4 * 5 + 1 ,修正因子为 d = b /4 *5 为5的n+1次方。有结论2可得到修正因子为  e = (c mod 4) *d 。

由上个条件得到的下一步的递归条件:所以这一步的鱼数目为 c + e,等差为 d 与 4的最小公倍数,又由于 d 必为  5 的m次幂,所以等差直接为 4 * d 。


对了,其实上面还缺少一个 b = 4 * 5^n的证明:其实用递归的方法很容易证明。








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值