[Java]第九屆藍橋杯真題—第幾個幸運數

到x星球旅行的遊客都被髮給一個整數,作爲遊客編號。 x星的國王有個怪癖,他只喜歡數字3,5和7。
國王規定,遊客的編號如果只含有因子:3,5,7,就可以獲得一份獎品。 我們來看前10個幸運數字是: 3 5 7 9 15 21 25 27
35 45 因而第11個幸運數字是:49 小明領到了一個幸運數字
59084709587505,他去領獎的時候,人家要求他準確地說出這是第幾個幸運數字,否則領不到獎品。
請你幫小明計算一下,59084709587505是第幾個幸運數字。 需要提交的是一個整數,請不要填寫任何多餘內容。

思路:遞推。根據題意,用3,5,7這三個數字無法互相推出。因此前面肯定還存在數字推出它們(即初始數字),從而遞推出3,7,5,. . .等。顯而易見初始數字只能爲1,並且規則有三個(y=3x, y=5x, y=7x)。由三個規則對應聲明三個下標數p0,p1,p2。從初始數1開始算出三個結果,將結果中最小的數放進數組,例如當前的數已經算過對應的規則2,則對應下標數p2向後移動一位即px++。同理逐個遞推,直到算出要找的數或符合設定的條件而退出運算。
總結:遞推說白了就是由前面的數經過某些規則得出後面的數。這裏就是由前面的數字1(初始數),通過三個規則(y=3x y=5x y=7x)將得出的數有序放到後面。所以也就說遞推上面的每個數字都要參與三個規則的運算。三個下標只不過是用來標明當前指向的下標前面的數字已經參與過對應規則的運算。

public class Main {

    public static void main(String[] args) {
        long[] m = new long[10000];
        m[0] = 1;
        int index = 1;
        int p0 = 0;
        int p1 = 0;
        int p2 = 0;
        while (index<m.length) {
            long a = 3 * m[p0];
            long b = 5 * m[p1];
            long c = 7 * m[p2];
            m[index] = min(a, b, c);
            if (m[index] == a)
                p0++;
            if (m[index] == b)
                p1++;
            if (m[index] == c)
                p2++;
            index++;
            if (m[index - 1] == 59084709587505L) {
                System.out.print(index - 1);
                return;
            }
        }
    }
    
    public static long min(long a, long b, long c) {
        long temp = a > b ? b : a;
        return temp > c ? c : temp;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章