算法学习——递推之水手分椰子
本文为作者原创,允许转载,不过请在文章开头明显处注明链接和出处!!! 谢谢配合~
作者:stars-one
链接:https://www.cnblogs.com/stars-one/p/9916245.html
本篇大约有863个字,阅读预计需要1.08分钟
算法描述
五个水手来到一个岛上,采了一堆椰子后,因为疲劳都睡着了。一段时间后,第一个水手醒来,悄悄地将椰子等分成五份,多出一个椰子,便给了旁边的猴子,然后自己藏起一份,再将剩下的椰子重新合在一起,继续睡觉。不久,第二名水手醒来,同样将椰子了等分成五份,恰好也多出一个,也给了猴子。然而自己也藏起一份,再将剩下的椰子重新合在一起。以后每个水手都如此分了一次并都藏起一份,也恰好都把多出的一个给了猴子。第二天,五个水手醒来,发现椰子少了许多,心照不喧,便把剩下的椰子分成五份,恰好又多出一个,给了猴子。请问水手最初最少摘了多少个椰子?
算法思路
-
这里需要注意的是,没有初始条件,求最初最少摘了多少个椰子
-
y[i] 代表第i个水手偷藏的椰子
由题目可以得到 个迭代方程
n/5 = (n-n/5-1)/5
这里等式左边是第1个水手所藏的椰子数,右边则是下一个水手所藏的椰子数
化简可得递推公式
y[i+1]=(4y[i]-1)/5
从前往后推 -
当每次递推的所藏椰子数为正整数,则满足条件,这里通过使用
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+"个");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】