2023年第十四届蓝桥杯JAVA B组(上部分)

目录

试题 A: 阶乘求和

试题 B: 幸运数字

试题 C: 数组分割

试题 D: 矩形总面积


试题 A: 阶乘求和

本题总分:5 分

【问题描述】

令 S = 1! + 2! + 3! + ... + 202320232023!,求 S 的末尾 9 位数字。 提示:答案首位不为 0。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路:看见  202320232023!  妈耶,太大了!

直接  BigInteger

public class Test2 {
    public static void main(String[] args) {
        // 初始化变量
        BigInteger num = new BigInteger("1"); // num用于存储每次计算的结果
        BigInteger ad = new BigInteger("1"); // ad用于存储每次计算的底数
        BigInteger sum = new BigInteger("0"); // sum用于存储所有计算结果的和
        BigInteger m = new BigInteger("1000000000"); // m用于存储模数

        // 循环计算
        for (int j = 1; j <= 320232023; j++) {
            num=num.multiply(ad).mod(m); // 计算num
            ad=ad.add(new BigInteger("1")); // 更新ad
            sum=sum.add(num).mod(m); // 更新sum
        }
        System.out.println(sum); // 输出结果
    }
}
420940313

之所以取值范围用:320232023  而不是:202320232023

原因【你们细品】

 

 

 故此:

 

试题 B: 幸运数字

本题总分:5 分

【问题描述】

哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整 数。例如 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 个幸运数 字是多少?你只需要告诉小蓝这个整数的十进制表示即可。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

public class Test {
    public static void main(String[] args) {

        int cnt=0;
        // 循环1到999999
        for (int num = 1; num <= 999999; num++) {
            // 将num转换为二进制、八进制、十六进制字符串
            String n2 = Integer.toBinaryString(num);
            String n8 = Integer.toOctalString(num);
            String n10=num+"";
            String n16 = Integer.toHexString(num);
            // 如果满足四种进制下各位数字之和能整除num
            if(checkn2(n2,num)&&checkn8(n8,num)&&checkn10(n10,num)&&checkn16(n16,num)){
                cnt++;
                // 如果是第2023个满足条件的数,输出
                if (cnt==2023)System.out.println(num);

            }

        }




    }

    // 检查十六进制下各位数字之和能否整除num
    private static boolean checkn16(String n16, int num) {
        int sum=0;
        for (int i = 0; i < n16.length() ;i++) {
            // 如果是a~f,转换为10~15
            if (n16.charAt(i)=='a'){
                sum+=10;
                continue;
            }
            if (n16.charAt(i)=='b'){
                sum+=11;
                continue;

            }
            if (n16.charAt(i)=='c'){
                sum+=12;
                continue;
            }
            if (n16.charAt(i)=='d'){
                sum+=13;
                continue;
            }
            if (n16.charAt(i)=='e'){
                sum+=14;
                continue;

            }
            if (n16.charAt(i)=='f'){
                sum+=15;
                continue;

            }
            // 如果是数字,转换为int类型并加到sum上
            sum+=n16.charAt(i)-'0';

        }
        // 如果sum能整除num,返回true,否则返回false
        if (num%sum==0){
            return true;
        }
        return false;

    }

    // 检查十进制下各位数字之和能否整除num
    private static boolean checkn10(String n10, int num) {
        int sum=0;
        for (int i = 0; i <n10.length() ; i++) {
            // 将数字字符转换为int类型并加到sum上
            sum+=n10.charAt(i)-'0';
        }
        // 如果sum能整除num,返回true,否则返回false
        if (num%sum==0){
            return true;
        }
        return false;

    }

    // 检查八进制下各位数字之和能否整除num
    private static boolean checkn8(String n8, int num) {
        int sum=0;
        for (int i = 0; i <n8.length() ; i++) {
            // 将数字字符转换为int类型并加到sum上
            sum+=n8.charAt(i)-'0';
        }
        // 如果sum能整除num,返回true,否则返回false
        if (num%sum==0){
            return true;
        }
        return false;
    }

    // 检查二进制下各位数字之和能否整除num
    private static boolean checkn2(String n2, int num) {
        int sum=0;
        for (int i = 0; i <n2.length() ; i++) {
            // 将数字字符转换为int类型并加到sum上
            sum+=n2.charAt(i)-'0';
        }
        // 如果sum能整除num,返回true,否则返回false
        if (num%sum==0){
            return true;
        }
        return false;
    }


}
215040

试题 C: 数组分割

晚点更新

试题 D: 矩形总面积

时间限制: 1.0s 内存限制: 512.0MB 本题总分:10 分

【问题描述】

平面上有个两个矩形 R1 和 R2,它们各边都与坐标轴平行。设 (x1, y1) 和

(x2, y2) 依次是 R1 的左下角和右上角坐标,(x3, y3) 和 (x4, y4) 依次是 R2 的左下 角和右上角坐标,请你计算 R1 和 R2 的总面积是多少? 注意:如果 R1 和 R2 有重叠区域,重叠区域的面积只计算一次。

【输入格式】

输入只有一行,包含 8 个整数,依次是:x1,y1,x2,y2,x3,y3,x4 和 y4。

【输出格式】

一个整数,代表答案。

【样例输入】

2 1 7 4 5 3 8 6

【样例输出】

22

【样例说明】

样例中的两个矩形如图所示:

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x1 = sc.nextInt(); // 输入第一个矩形左下角的横坐标
        int y1 = sc.nextInt(); // 输入第一个矩形左下角的纵坐标
        int x2 = sc.nextInt(); // 输入第一个矩形右上角的横坐标
        int y2 = sc.nextInt(); // 输入第一个矩形右上角的纵坐标
        int x3 = sc.nextInt(); // 输入第二个矩形左下角的横坐标
        int y3 = sc.nextInt(); // 输入第二个矩形左下角的纵坐标
        int x4 = sc.nextInt(); // 输入第二个矩形右上角的横坐标
        int y4 = sc.nextInt(); // 输入第二个矩形右上角的纵坐标
        int area1 = (x2 - x1) * (y2 - y1); // 计算第一个矩形的面积
        int area2 = (x4 - x3) * (y4 - y3); // 计算第二个矩形的面积
        int overlapWidth = Math.min(x2, x4) - Math.max(x1, x3); // 重叠部分的宽度
        int overlapHeight = Math.min(y2, y4) - Math.max(y1, y3); // 重叠部分的高度
        int overlapArea = Math.max(overlapWidth, 0) * Math.max(overlapHeight, 0); // 重叠部分的面积
        int totalArea = area1 + area2 - overlapArea; // 总面积
        System.out.println(totalArea); // 输出总面积
    }

2 1 7 4 5 3 8 6
22

我的答案可能存在错误或不够准确,请您谅解。如果您有任何疑问或者发现错误的地方,欢迎指出,我会尽力改正。

猜你喜欢

转载自blog.csdn.net/Javascript_tsj/article/details/130032163