您的位置:首页 > 职场人生

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

2011-09-23 00:35 288 查看
在首页上看到这篇文章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的证明:其实用递归的方法很容易证明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: