大家好,我是snippet,今天是刷蓝桥杯真题的第二天,下面是我今天的题解
目录
一、奇数倍数
题目要求:
请你找到最小的整数 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();
}
}
二、求值
题目要求:
学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 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();
}
}
三、求和
题目要求:
给定 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();
}
}
四、数位排序
题目要求:
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。例如, 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();
}
}