题目:
话说某天一艘海盗船被天下砸下来的一头牛给击中了,5个倒霉的家伙只好逃难到一个孤岛,发现岛上孤零零的,幸好有棵椰子树,还有一只猴子! 大家把椰子全部采摘下来放在一起,但是天已经很晚了,所以就睡觉先. 晚上某个家伙悄悄的起床,悄悄的将椰子分成5份,结果发现多一个椰子,顺手就给了幸运的猴子,然后又悄悄的藏了一份,然后把剩下的椰子混在一起放回原处,最后还是悄悄滴回去睡觉了. 过了会儿,另一个家伙也悄悄的起床,悄悄的将剩下的椰子分成5份,结果发现多一个椰子,顺手就又给了幸运的猴子,然后又悄悄滴藏了一份,把剩下的椰子混在一起放回原处,最后还是悄悄滴回去睡觉了. 又过了一会 ... ... 又过了一会 ... 总之5个家伙都起床过,都做了一样的事情 早上大家都起床,各自心怀鬼胎的分椰子了,这个猴子还真不是一般的幸运,因为这次把椰子分成5分后居然还是多一个椰子,只好又给它了。 问题来了,问这堆椰子最少有 1 个?
思路:
1、发散思维
假设借给海盗们4个椰子,这样第一个海盗藏起来的加上他给猴子的1个,正好是椰子总数的五分之一。第二个海岛藏起来的加上他给猴子的1个,正好是剩下椰子数的五分之一,以此类推6次,因为题目的问题是至少有多少个,假设最后每个海盗只得到一个椰子,因此一共有1*5*5*5*5*5*5-4=15621个椰子。
2、计算机思维
如果要通过计算机来计算椰子的个数:
第一种是可以通过上述的公式来计算;
第二种需要通过枚举来计算判断,
假设到最后剩下了a0=x个椰子,则经过第5个人操作之前就有a1=5*a0/4+1个椰子,经过第4个人操作之前有a2 =5*a1/4+1个椰子,因此可以得到递公式a(i+1) =5*a(i)/4+1,而且a(i)(i=0,1,2,3,4,5)都能够被5整除且余数为1,求最小的a5。
逆向思考一下,假设至少有n个,每次操作之前,需要满足的椰子个数条件:除5余数为1,减1除5大于等于1,即n%5==1 && (n-1)/5>=1;操作之后的椰子个数,等于减1后的4/5,即n=(n-1)*4/5。
代码:
#include <iostream> using namespace std; void banana(){ int num=5; bool flag=true; int tmp; while(flag){ num++; flag=false; tmp=num; for(int i=0;i<6;i++){ if(tmp%5==1 && (tmp-1)/5>=1){ tmp=(tmp-1)*4/5; } else{ flag=true; break; } } } cout<<num<<endl; } int main() { banana(); return 0; }