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

算法描述

五個水手來到一個島上,採了一堆椰子後,由於疲勞都睡着了。一段時間後,第一個水手醒來,悄悄地將椰子等分紅五份,多出一個椰子,便給了旁邊的猴子,而後本身藏起一份,再將剩下的椰子從新合在一塊兒,繼續睡覺。不久,第二名水手醒來,一樣將椰子了等分紅五份,剛好也多出一個,也給了猴子。然而本身也藏起一份,再將剩下的椰子從新合在一塊兒。之後每一個水手都如此分了一次並都藏起一份,也剛好都把多出的一個給了猴子。次日,五個水手醒來,發現椰子少了許多,心照不喧,便把剩下的椰子分紅五份,剛好又多出一個,給了猴子。請問水手最初最少摘了多少個椰子?算法

算法思路

  1. 這裏須要注意的是,沒有初始條件,求最初最少摘了多少個椰子函數

  2. y[i] 表明第i個水手偷藏的椰子3d

    由題目能夠獲得 個迭代方程 n/5 = (n-n/5-1)/5code

    這裏等式左邊是第1個水手所藏的椰子數,右邊則是下一個水手所藏的椰子數blog

    化簡可得遞推公式y[i+1]=(4y[i]-1)/5 從前日後推im

  3. 當每次遞推的所藏椰子數爲正整數,則知足條件,這裏經過使用floor函數能夠斷定一個數是否爲整數db

算法實現

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

結果

相關文章
相關標籤/搜索