算法描述
五個水手來到一個島上,采了一堆椰子后,因為疲勞都睡着了。一段時間后,第一個水手醒來,悄悄地將椰子等分成五份,多出一個椰子,便給了旁邊的猴子,然后自己藏起一份,再將剩下的椰子重新合在一起,繼續睡覺。不久,第二名水手醒來,同樣將椰子了等分成五份,恰好也多出一個,也給了猴子。然而自己也藏起一份,再將剩下的椰子重新合在一起。以后每個水手都如此分了一次並都藏起一份,也恰好都把多出的一個給了猴子。第二天,五個水手醒來,發現椰子少了許多,心照不喧,便把剩下的椰子分成五份,恰好又多出一個,給了猴子。請問水手最初最少摘了多少個椰子?
算法思路
-
這里需要注意的是,沒有初始條件,求最初最少摘了多少個椰子
-
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+"個");