• (笔试题)分椰子


    题目:

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

      

  • 相关阅读:
    Java中关于String类型的10个问题
    关于Linux中后台运行程序(&)退出时收不到SIGHUP信号的说明
    《Javascript DOM编程艺术》学习笔记 第8章 充实文档的内容
    《Javascript DOM编程艺术》学习笔记 第7章 动态创建标记
    《Javascript DOM编程艺术》学习笔记 第1-6章
    golang: 读取已关闭的缓冲型channel的表现
    关于《汇编语言(王爽)》程序6.3使用16个dw 0的问题
    关于寄存器的一些笔记
    img格式镜像转ISO格式
    深入理解计算机操作系统:第1章 计算机系统漫游(学习笔记)
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4599539.html
Copyright © 2020-2023  润新知