算法學習——遞推之水手分椰子


算法描述

五個水手來到一個島上,采了一堆椰子后,因為疲勞都睡着了。一段時間后,第一個水手醒來,悄悄地將椰子等分成五份,多出一個椰子,便給了旁邊的猴子,然后自己藏起一份,再將剩下的椰子重新合在一起,繼續睡覺。不久,第二名水手醒來,同樣將椰子了等分成五份,恰好也多出一個,也給了猴子。然而自己也藏起一份,再將剩下的椰子重新合在一起。以后每個水手都如此分了一次並都藏起一份,也恰好都把多出的一個給了猴子。第二天,五個水手醒來,發現椰子少了許多,心照不喧,便把剩下的椰子分成五份,恰好又多出一個,給了猴子。請問水手最初最少摘了多少個椰子?

算法思路

  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+"個");

結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM