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

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

第一题:

题目:

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

答案:

java 复制代码
// 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的倍数的数"。

代码求解:

java 复制代码
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范围中最大的类斐波那契循环数。(填空题)

答案:

java 复制代码
// 7913837

思路&解析:

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

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

代码求解:

java 复制代码
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‬
...... ......

感谢阅读!

转载请声明出处,谢谢!

相关推荐
DoraBigHead33 分钟前
小哆啦解题记——异位词界的社交网络
算法
序属秋秋秋39 分钟前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
许白掰41 分钟前
Linux入门篇学习——Linux 工具之 make 工具和 makefile 文件
linux·运维·服务器·前端·学习·编辑器
木头左2 小时前
逻辑回归的Python实现与优化
python·算法·逻辑回归
B1nna2 小时前
Docker学习
学习·docker·容器
quant_19863 小时前
R语言如何接入实时行情接口
开发语言·经验分享·笔记·python·websocket·金融·r语言
lifallen6 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
promising-w8 小时前
【运算放大器专题】基础篇
嵌入式硬件·学习
宝山哥哥8 小时前
网络信息安全学习笔记1----------网络信息安全概述
网络·笔记·学习·安全·网络安全
前端开发与ui设计的老司机8 小时前
从UI设计到数字孪生实战:构建智慧教育的个性化学习平台
学习·ui