五人分椰子问题

来源:互联网 发布:淘宝懒人鞋阿迪 编辑:程序博客网 时间:2024/04/27 23:02
链接:https://www.nowcoder.com/questionTerminal/5ccede9ae50b465c8c3283038d9a4a48
来源:牛客网

话说某天一艘海盗船被天下砸下来的一头牛给击中了,5个倒霉的家伙只好逃难到一个孤岛,发现岛上孤零零的,幸好有棵椰子树,还有一只猴子! 大家把椰子全部采摘下来放在一起,但是天已经很晚了,所以就睡觉先. 晚上某个家伙悄悄的起床,悄悄的将椰子分成5份,结果发现多一个椰子,顺手就给了幸运的猴子,然后又悄悄的藏了一份,然后把剩下的椰子混在一起放回原处,最后还是悄悄滴回去睡觉了. 过了会儿,另一个家伙也悄悄的起床,悄悄的将剩下的椰子分成5份,结果发现多一个椰子,顺手就又给了幸运的猴子,然后又悄悄滴藏了一份,把剩下的椰子混在一起放回原处,最后还是悄悄滴回去睡觉了. 又过了一会 ... ... 又过了一会 ... 总之5个家伙都起床过,都做了一样的事情 早上大家都起床,各自心怀鬼胎的分椰子了,这个猴子还真不是一般的幸运,因为这次把椰子分成5分后居然还是多一个椰子,只好又给它了。 问题来了,问这堆椰子最少有多少个?


这是牛客网上面的一道智力题,很多人给出了答案,有人直接理论说明,有人用编程的方式解决了,但是没有给出注释。在这里,我参照其中一段代码,按照自己的理解做一些必要的说明。

#include<stdio.h>#include<stdlib.h>#define MAX 10000 //假设最后每人分到的椰子最多为10000个 int num=0;//作为全局变量,用于记录最后总的椰子数 //定义函数solve,来从最后每人分到的椰子数入手,递推出一开始总的椰子数 //其中参数就是每人最后分到的实际的椰子数,显然该值最小为1,因为不可能最后一个椰子也没分到呀!//返回值就是一个bool值,如果为真,说明输入的最小值可以满足题目的要求,如果为假则说明不满足要求,需要重新输入 bool solve(int index){    int res=index*5;        //最后每个人的椰子数乘以5再加1 ,即 (res+1)表示五个人最后要分的椰子,也可以说     for(int i=0;i<5;i++){   //成是五个人第五次分之前剩下的椰子总数         if((res+1)%4){//显然,这个总数应该是第四次分完之后剩下的那些椰子,也就是说这些椰子应该可以被             return false;   //4整除,因为这是第四个人分完五份之后(给了猴子一个)取走自己的那一份剩下的四份         }                   //所以理所当然可以被4整除,如果不能整除,说明输入的值index不是要求的值,所以需要重新         res=(res+1)*5/4;    // 输入,当满足被4整除的要求后,就开始计算第四次分之前的椰子总数(此时还应加上给猴子的一个),也就是语句     }                       //res=(res+1)*5/4;然后一直连续循环5次即可找到第一次分之前的椰子总数,其实最后应该是(res+1)*5/5     num=res+1;    return true;}int main(){    for(int i=1;i<=MAX;i++){        if(solve(i)){            printf("%d\n",num);            break;        }    }    return 0;}


0 0
原创粉丝点击