2016京东在线笔试(编程题之一)

最初这个题目应该是五猴分桃,想必大家也不陌生,京东只是把五只猴子变成了N只。

也就是有N个猴子,一堆桃子,第一个猴子来了,分成N分后多了一个,于是他把多出来的扔了,拿走了N份中的1份;

第二个猴子又来了,把剩下的桃子也分成了N分,多了一个扔了,也拿走了N份中的1份;

然后第三只猴子······直到第N只猴子,以此类推,问这队桃子至少有多少个呢?


解题方法网上提供了很多,这里与大家分享个人认为最好理解的一个答案:


不知道亲们有没有听过分马的故事:

一个老人临终有17只马,三个儿子,并在遗嘱上写着:“我把十七匹马全都留给我的三个儿子。

长子得一半,次子得三分之一,给幼子九分之一。不许流血,不许杀马。你们必须遵从父亲的遗愿!”

这下可难倒了三个儿子了,怎么分呢?有一位智者给出了答案。

这位智者从邻居家借来一匹马,分给大儿子一半,也就是9只,二儿子三分之一,也就是6只,

小儿子九分之一,也就是2只,刚好剩下一匹再换给邻居,于是就愉快的分完啦!

当然,这里也有人说加了一只就不是原概念上的一半或是三分之一了,但其本身1/2 + 1/3 + 1/9 =17/18 全部分配的概率就不是1。

但这是一种非常好的解决方法。


于是我们先借来N-1个桃子,此时假设共有X个桃子;

那么第一只猴子拿去了X/N,还剩(1-1/N)*X;

同理,第二只猴子拿走桃子后还剩(1-1/N)*(1-1/N)*X

以此类推,最后一只猴子拿走后还剩(1-1/N)*···(N次相乘)···*(1-1/N)*X

那么最终剩下的桃子数目必须是整数,即X需要等于N的N次方,

还掉借来的N-1个桃子,原来最少需要有X-(N-1)个桃子。

这样子的话实现代码就非常简单喽。

当然还有其他方案,如利用循环之类的,就不一一道来啦。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值