(笔试题)分椰子

题目:

话说某天一艘海盗船被天下砸下来的一头牛给击中了,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;
}

  

 

posted @ 2015-06-25 11:28  AndyJee  阅读(1201)  评论(0编辑  收藏  举报