五人分椰子问题

链接: 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值