[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;
    }

}

你可能感兴趣的:([Java]第九届蓝桥杯真题—第几个幸运数)