2023年第十四届蓝桥杯Java B组个人题解(填空题)

说在前面

大学生涯中第一次参加蓝桥杯,赛前也刷了部分题(简单的枚举,模拟,贪心,dfs等)。但结果却不太理想,还是好几题不会(太菜了5555555555大佬勿喷)

不过讲真eclipse是真难用,习惯了IDEA的快捷键和补全的同学建议在赛前复习一下eclipse的使用。

下面和大家分享一下两道最简单的(我是这么认为的)填空题题解。

试题A:阶乘求和

问题描述
  令 S = 1! + 2! + 3! + … + 202320232023!,求 S 的末尾 9 位数字。
  提示:答案首位不为 0。
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

看到这题的数据就秒想到BigInteger,奈何在考场上已经忘了BigInteger的用法了。。。。。。。。我们当然不能直接算出S的最后结果并取余,那不仅爆long,甚至爆BigInteger了。。

第一种解法:

public class A {
    //全局变量temp用于随时对大数取余
    static long temp=1000000000;
    public static void main(String[] args) {
        long sum=0;
        //尝试找出前100个数的阶乘和后就位是否有规律
        for (int i = 1; i <= 100; i++) {
            sum=(sum+digui(i))%temp;
            System.out.println(i+"的阶乘和为"+sum);
        }
    }
    public static long digui(long a){
        if(a==0 || a==1){
            return 1;
        }
        //在考虑此阶乘可能爆long的同时也要考虑前阶乘数*此数也有爆long的可能性
        return ((digui(a-1)%temp)*a)%temp;
    }
}

最后我们发现:

1的阶乘和为1
2的阶乘和为3
3的阶乘和为9
4的阶乘和为33
5的阶乘和为153
6的阶乘和为873
7的阶乘和为5913
8的阶乘和为46233
9的阶乘和为409113
10的阶乘和为4037913
11的阶乘和为43954713
12的阶乘和为522956313
13的阶乘和为749977113
14的阶乘和为928268313
15的阶乘和为602636313
16的阶乘和为392524313
17的阶乘和为820620313
18的阶乘和为526348313
19的阶乘和为935180313
20的阶乘和为111820313
21的阶乘和为821260313
22的阶乘和为428940313
23的阶乘和为405580313
24的阶乘和为844940313
25的阶乘和为828940313
26的阶乘和为412940313
27的阶乘和为180940313
28的阶乘和为684940313
29的阶乘和为300940313
30的阶乘和为780940313
31的阶乘和为660940313
32的阶乘和为820940313
33的阶乘和为100940313
34的阶乘和为620940313
35的阶乘和为820940313
36的阶乘和为20940313
37的阶乘和为420940313
38的阶乘和为620940313
39的阶乘和为420940313
40的阶乘和为420940313
41的阶乘和为420940313
42的阶乘和为420940313
43的阶乘和为420940313
44的阶乘和为420940313
45的阶乘和为420940313
46的阶乘和为420940313
47的阶乘和为420940313
48的阶乘和为420940313
49的阶乘和为420940313
50的阶乘和为420940313

39及以后数字的阶乘和后九位均为420940313,所以最终答案就是420940313。

第二种解法(直接开BigInteger)

import java.math.BigInteger;

public class A {
    public static void main(String[] args) {
        BigInteger a = new BigInteger("1");
        BigInteger ans = new BigInteger("0");
        for (int i = 1; i <= 50; i++) {
            a = a.multiply(new BigInteger("" + i));
            ans = ans.add(a);
            System.out.println(i + "的阶乘和后9位为" + ans.mod(new BigInteger("1000000000")));
        }
    }
}

试题B:幸运数字

问题描述
  哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整数。例如 126 是十进制下的一个哈沙德数,因为 (126)10 mod (1+2+6) = 0;126也是八进制下的哈沙德数,因为 (126)10 = (176)8,(126)10 mod (1 + 7 + 6) = 0;同时 126 也是 16 进制下的哈沙德数,因为 (126)10 = (7e)16,(126)10 mod (7 + e) = 0。小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为哈沙德数,那么这个数字就是幸运数字,第 1 至第 10 个幸运数字的十进制表示为:1 , 2 , 4 , 6 , 8 , 40 , 48 , 72 , 120 , 126 . . . 。现在他想知道第 2023 个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

这道题考察的是进制转换,会调用API就可以。

十进制转二进制:Integer.toBinaryString(i)
十进制转八进制:Integer.toOctalString(i)
十进制转十六进制:Integer.toHexString(i)

当然也可以用

  Integer.toString(n,2)
  Integer.toString(n,8)
  Integer.toString(n,16)

public class B {
    public static void main(String[] args) {
        int count = 0;
        int index = 1;
        while (true) {
            String s2 = Integer.toBinaryString(index);//转换二进制
            String s8 = Integer.toOctalString(index);//转换八进制
            String s16 = Integer.toHexString(index);//转换十六进制
            //判断是否都能整除(不要忘了自己本身)
            if (index % getSum(s2) == 0 && index % getSum(s8) == 0 && index % getSum(s16) == 0 && index % getSum("" + index) == 0) {
                count++;
            }
            if (count == 2023) {
                System.out.println("第2023个幸运数字是" + index);
                break;
            }
            index++;
        }
    }

    public static int getSum(String str) {
        int sum = 0;
        char chars[] = str.toCharArray();
        //在转十六进制时需要注意对字母的处理
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] >= 'a' && chars[i] <= 'f') {
                sum += (chars[i] - 'a' + 10);
            } else {
                sum += chars[i] - '0';
            }
        }
        return sum;
    }
}

希望本章能对大家有所帮助~

如有错误,欢迎评论区指正!!
 

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值