2024第十五届蓝桥杯 Java B组 填空题-第二题:

时间:2024-04-15 11:46:55

题目:

(个人理解:)将一个n位的数字按一定的规则排成一个数列。
规则:

  1. 这个数列的起始部分分别为该数字每一位上的数。例如:数字(12345)排成数列是【1,2,3,4,5】
  2. 这个数列的其它部分分别为从当前数列的最后一位起,前n项的和。例如数字(12345,共5位)排成数列【1,2,3,4,5,(?),......】,此时数列的第6个数就是从当前数列的最后一位起前5项的和,即(1+2+3+4+5=15)【1,2,3,4,5,15】;第7个数就是从当前数列的最后一位起前5项的和,即(2+3+4+5+15=29)【1,2,3,4,5,15,29】;......

       如果这个数列中包含这个数字本身,那么这个数就是类斐波那契循环数。
       求从0~10^7范围中最大的类斐波那契循环数。(填空题)

答案:

// 7913837

思路&解析:

       大家都知道,int的取值范围为-2^31 ~ 2^31-1,即±21亿左右。这里的2^7为1千万,显然出题人并不想为难我们,使用int即可。

       这个数列使用数组或集合均可,我们主要进行三步操作:首先只需要将传入的数字拆分再存入;其次计算数列之后的每一位;最后判断数列中是否存在这个传入的数字即可。(当然数组或集合中也没有必要存储每一个拆分再求和的数字,只需存储每一轮那个最后也是最大的数字即可)

代码求解:

public class Main {
    static List<Integer> list = new ArrayList<>();

    public static void main(String[] args) {
        // 10^7 = 1千万

        for (int i = 10000000; i > 0; --i) {// 要最大的就从最大边界开始循环

            feb(i);// 进行判断

            if (list.get(list.size() - 1) == i) {// 从集合中取出的最后一个数字与i相等
                System.out.println("找到你了:" + i + ",你就是题目所要求的类斐波那契循环数!");
                System.exit(0);
            }

            list.clear();
            System.out.println("当前找到第" + i + "个数了!");
        }

    }

    public static void feb(int n) {
        int sum = 0;
        String num = n + "";// 方便判断当前n是几位数

        for (int i = 0; i < num.length(); i++) {// 将n的每一位数字加入集合
            list.add(Integer.parseInt(String.valueOf(num.charAt(i))));
        }


        while (true) {
            for (int i = list.size() - 1; i >= list.size() - num.length(); --i) {// 依次求n的前位数项和
                sum += list.get(i);
            }

            if (sum <= n) {// 如果此时sum大于传入的数字n就没有必要再继续计算前位数项和了
                list.add(sum);
                sum = 0;
            } else {
                break;
            }
        }
    }
}

Console:

附录:

附上实际计算结果:

序号 数值
1 7
2 9
3 1
4 3
5 8
6 3
7 7
8 38
9 69
10 129
11 257
12 511
13 1,014
14 2,025
15 4,043
16 8,048
17 16,027
18 31,925
19 63,593
20 126,675
21 252,336
22 502,647
23 1,001,251
24 1,994,454
25 3,972,881‬
26 7,913,837‬
...... ......

感谢阅读!

转载请声明出处,谢谢!