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

发布于:2024-04-15 ⋅ 阅读:(170) ⋅ 点赞:(0)

声明:博主比较菜,以下均为个人想法。解决方法仅供参考。欢迎大家一起讨论交流!

第一题:

题目:

(简洁版)从小到大排列是20或24倍数的正整数,前10个数依次是:”20 24 40 48 60 72 80 96 100 120“,求第202420242024个数是多少?(填空题)

答案:

// 2429042904288

思路&解析:

       题目中给出的示例其实就已经点出了这些数排列的规律:20、24的最小公倍数就是120。翻译成人话就是:每10个数为一轮。让我们说的再明白些:

序号 数值
1 20
2 24
3 40
4 48
5 60
6 72
7 80
8 96
9 100
10 120
...... ......

       可以看出,奇数均为20的倍数,偶数均为24的倍数。

       而我们要求的第202420242024个数正好是偶数,所以答案一定是24的倍数。

       此外,让我们再回到前10个数的例子中来。可以发现:10个数中一半为20的倍数,一半为24的倍数(奇偶各占一半)。所以可以想到:202420242024个数中,一半是20的倍数,一半是24的倍数。所以此时”求第202420242024个数“的问题就转化为了”求第202420242024 / 2 = 101210121012个且是24的倍数的数“。

代码求解:

BigInteger bigInteger = new BigInteger(new BigInteger("101210121012").multiply(new BigInteger("24")).toString());
System.out.println(bigInteger);// 2429042904288

第二题:

题目:

(个人理解:)将一个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‬
...... ......

感谢阅读!

转载请声明出处,谢谢!


网站公告

今日签到

点亮在社区的每一天
去签到