算法学习——递推之水手分椰子

本文探讨了一个经典的数学谜题——五个水手和一堆椰子的问题。通过建立迭代方程和递推公式,解析了算法思路,并提供了一段实现代码,最终求出了水手们最初最少摘了多少个椰子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法描述

五个水手来到一个岛上,采了一堆椰子后,因为疲劳都睡着了。一段时间后,第一个水手醒来,悄悄地将椰子等分成五份,多出一个椰子,便给了旁边的猴子,然后自己藏起一份,再将剩下的椰子重新合在一起,继续睡觉。不久,第二名水手醒来,同样将椰子了等分成五份,恰好也多出一个,也给了猴子。然而自己也藏起一份,再将剩下的椰子重新合在一起。以后每个水手都如此分了一次并都藏起一份,也恰好都把多出的一个给了猴子。第二天,五个水手醒来,发现椰子少了许多,心照不喧,便把剩下的椰子分成五份,恰好又多出一个,给了猴子。请问水手最初最少摘了多少个椰子?

算法思路

  1. 这里需要注意的是,没有初始条件,求最初最少摘了多少个椰子

  2. y[i] 代表第i个水手偷藏的椰子

    由题目可以得到 个迭代方程 n/5 = (n-n/5-1)/5

    这里等式左边是第1个水手所藏的椰子数,右边则是下一个水手所藏的椰子数

    化简可得递推公式y[i+1]=(4y[i]-1)/5 从前往后推

  3. 当每次递推的所藏椰子数为正整数,则满足条件,这里通过使用floor函数可以判定一个数是否为整数

算法实现

    int i =1;
    double k,y,x;
    k=1.0;
    y=k;
    while(i<=5){
        i++;
        y = (4*y-1)/5;
        if(y!=Math.floor(y)){
            k++;
            y=k;
            i=1;
        }
    }
    x=5*k+1;
    System.out.println("椰子至少有"+x+"个");

结果

1210268-20181106164532964-832410084.png

转载于:https://www.cnblogs.com/kexing/p/9916245.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值