蓝桥杯31天真题冲刺|题解报告|第二天

大家好,我是snippet,今天是刷蓝桥杯真题的第二天,下面是我今天的题解 

目录

一、奇数倍数

二、求值

三、求和

四、数位排序


一、奇数倍数

题目链接:奇数倍数 - 蓝桥云课 (lanqiao.cn)

题目要求:

请你找到最小的整数 X 同时满足:

1.X 是 2019 的整倍数;

2.X 的每一位数字都是奇数。

解题思路:

从2019开始遍历,依次按倍数递增,求这个数是不是奇数,然后再数位求,如果是就直接输出

代码:

package 蓝桥杯31天真题冲刺.Day2;

import java.io.*;

/**
 * @author snippet
 * @data 2023-03-04
 * 奇数倍数-蓝桥云课
 */
public class T1 {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

    static int x;// x表示要求的数

    public static void main(String[] args) throws IOException {
        for (int i = 1; i <= 100; i++) {
            boolean flag = false;// 如果这个数和所有位数都是奇数则为true
            if (((i * 2019) & 1) == 1) {
                int k = i * 2019;
                flag = true;
                while (k > 0) {
                    int t = k % 10;
                    k /= 10;
                    if ((t & 1) == 0) flag = false;
                }
            }
            if (flag) {
                x = i * 2019;
                break;
            }
        }
        pw.println(x);
        pw.flush();
        br.close();
    }
}

二、求值

题目链接:求值 - 蓝桥云课 (lanqiao.cn)

题目要求:

学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 t,总是可以找到含有 t 个约数的整数。小明对于含有 t 个约数的最小数非常感兴趣,并把它定义为 St​ 。

例如 S1​=1,S2​=2,S3​=4,S4​=6,⋅⋅⋅ 。

现在小明想知道,当 t=100 时,St​ 是多少?即 S100​ 是多少?

解题思路:

用一个集合 set 来存要求的这个数 x 的所有约数,当set.size == 100时, x也就是我们要求的那个数(S100)

代码:

package 蓝桥杯31天真题冲刺.Day2;

import java.io.*;
import java.util.HashSet;

/**
 * @author snippet
 * @data 2023-03-05
 * 求值-蓝桥云课
 */
public class T2 {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

    static HashSet<Integer> set = new HashSet<>();// set集合用来存这个数所有的约数
    static int t,ans;// t表示这个数的约数个数 ans表示这个数的值

    static void check() {
        for (int i = 1; i <= 1000000; i++) {
            set = new HashSet<>();
            for (int j = 1; j <= i; j++) {
                if (i % j == 0) {
                    set.add(j);
                }
            }
            if (set.size() == t) {
                ans = i;
                return;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        t = 100;
        check();
        pw.println(ans);
        pw.flush();
        br.close();
    }
}

三、求和

题目链接:求和 - 蓝桥云课 (lanqiao.cn)

题目要求:

给定 n 个整数 a1​,a2​,⋅⋅⋅,an​ ,求它们两两相乘再相加的和,即:

S=a1​⋅a2​+a1​⋅a3​+⋯+a1​⋅an​+a2​⋅a3​+⋯+an−2​⋅an−1​+an−2​⋅an​+an−1​⋅an​

输入格式:

输入的第一行包含一个整数 n。

第二行包含 n 个整数 a1​,a2​,⋯,an​。

输出格式:

输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。

解题思路:

这个题的目的就是求每个数与后面所有数的乘积和,也就是从第二个数开始,每个数与前面所有数的乘积和,这样我们就可以使用前缀和要求和值,然后再进行乘积求和

代码:

package 蓝桥杯31天真题冲刺.Day2;

import java.io.*;

/**
 * @author snippet
 * @data 2023-03-05
 * 求和-蓝桥云课
 */
// 前缀和
public class T3 {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

    static int n;// n表示数据的个数
    static long ans;// ans表示和值
    static long[] arr = new long[200200];// 一维数组arr存给定数组数据
    static long[] f = new long[200200];;// 一维数组f存该数与该数前面所有数之和

    public static void main(String[] args) throws IOException {
        String[] s = br.readLine().split(" ");
        n = Integer.parseInt(s[0]);
        s = br.readLine().split(" ");

        // 数组数据存入 和 求前缀和
        for (int i = 1; i <= n; i++) {
            arr[i] = Integer.parseInt(s[i-1]);
            f[i] += f[i-1] + arr[i];
        }

        for (int i = 2; i <= n; i++) {
            ans += f[i-1] * arr[i];
        }
        pw.println(ans);
        pw.flush();
        br.close();
    }
}

四、数位排序

题目链接:数位排序 - 蓝桥云课 (lanqiao.cn)

题目要求:

小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。

给定正整数 n,m, 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元素是多少?

输入格式

输入第一行包含一个正整数 n 。第二行包含一个正整数 m 。

输出格式

输出一行包含一个整数, 表示答案。

解题思路:

这个题的目的就是让我们对求完数位和的数据进行重排序,有两个要求

1.如果两个数的数位和不同时,按数位和大小,从小到大进行排序;

2.如果两个数的数位和相同时,则按照它原来的数的大小,从小到大进行排序;

代码:

package 蓝桥杯31天真题冲刺.Day2;

import java.io.*;
import java.util.Arrays;
import java.util.Comparator;

/**
 * @author snippet
 * @data 2023-03-05
 * 数位排序-蓝桥云课
 */
// 重排序
public class T4 {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

    static int n,m;// n表示有n个数 m表示数位排序后要求的排在第m位的数
    static Integer[] arr;// 一维数组arr存1-n所有数

    // 求每个数的数位和
    static int check(int k) {
        int temp = 0;
        while (k != 0) {
            temp += k % 10;
            k /= 10;
        }
        return temp;
    }

    public static void main(String[] args) throws IOException {
        String[] s = br.readLine().split(" ");
        n = Integer.parseInt(s[0]);
        s = br.readLine().split(" ");
        m = Integer.parseInt(s[0]);

        arr = new Integer[n];

        for (int i = 0; i < n; i++) {
            arr[i] = i+1;
        }

        // 重写排序
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                int a = check(o1);
                int b = check(o2);
                if (a == b) return o1-o2;
                return a-b;
            }
        });

        pw.println(arr[m-1]);
        pw.flush();
        br.close();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snippet~

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值