第十四届蓝桥杯大赛软件赛国赛Java大学C组(部分)
跑步计划
问题描述
小蓝计划在某天的日期中出现 1 时跑 5 千米,否则只跑 1 千米。注意日期中出现 1 不仅指年月日也指星期。
请问按照小蓝的计划,2023 年小蓝总共会跑步锻炼多少千米?例如,5 月 1 日、1 月 13 日、11 月 5 日、4 月 3 日 (星期一) 小蓝会跑 5 千米,而 5 月 23 日小蓝会跑 1 千米 (示例日期均为 2023 年)
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
运行限制
| 语言 | 最大运行时间 | 最大运行内存 |
|---|---|---|
| C++ | 1s | 256M |
| C | 1s | 256M |
| Java | 2s | 256M |
| Python3 | 3s | 256M |
| PyPy3 | 3s | 256M |
| Go | 3s | 256M |
| JavaScript | 3s | 256M |
代码思路
import java.time.DayOfWeek;
import java.time.LocalDate;public class Main {public static void main(String[] args) {// 通过年、月、日创建日期对象.LocalDate localDate1 = LocalDate.of(2023, 1, 1);LocalDate localDate2 = LocalDate.of(2024, 1, 1);int ans = 0;// 检查localDate1是否与localDate2相同。while (!localDate1.isEqual(localDate2)) {String string = localDate1.toString();// 获取星期几(DayOfWeek 枚举类型).DayOfWeek dayOfWeek = localDate1.getDayOfWeek();if (string.contains("1") || dayOfWeek == DayOfWeek.MONDAY) {ans += 5;} else {ans++;}// 增加指定天数.localDate1 = localDate1.plusDays(1);}System.out.println(ans);}
}
//format(DateTimeFormatter formatter) 将日期格式化为字符串
//将日期格式化为字符串 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
//String formattedDate = date.format(formatter); // "2023/10/25"
混乘数字
问题描述
混乘数字的定义如下: 对于一个正整数 n,如果存在正整数 a,b,使得 n=a×b,而且 a 和 b 的十进制数位中每个数字出现的次数之和与 n 中对应数字出现次数相同,则称 n 为混乘数字。
例如,对于正整数 n=126,存在 a=6, b=21 满足条件,因此 126 是一个混乘数字。
又如,对于正整数 n=180225,存在 a=225, b=801 满足条件,因此 180225 是一个混乘数字。
请你帮助计算出,1∼1000000 (含)之间一共有多少个数字是混乘数字。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
运行限制
| 语言 | 最大运行时间 | 最大运行内存 |
|---|---|---|
| C++ | 1s | 256M |
| C | 1s | 256M |
| Java | 2s | 256M |
| Python3 | 5s | 256M |
| PyPy3 | 5s | 256M |
| Go | 5s | 256M |
| JavaScript | 5s | 256M |
代码思路
public class Main {public static void main(String[] args) {int ans = 0;for (int i = 1; i <= 1000000; i++) {for (int j = 1; j * j <= i; j++) {if (i % j == 0 && check(i / j, j, i)) {ans++;break;}}}System.out.println(ans);}// check函数是判断a和b的十进制数位中每个数字出现的次数之和与n中对应数字出现次数是否相同static boolean check(int a, int b, int n) {int num[] = new int[10];while (a != 0) {num[a % 10]++;a /= 10;}while (b != 0) {num[b % 10]++;b /= 10;}while (n != 0) {num[n % 10]--;n /= 10;}for (int i : num) {if (i != 0) {return false;}}return true;}
}
整数变换
问题描述
小蓝有一个整数 n。每分钟,小蓝的数都会发生变化,变为上一分钟的数减去上一分钟的数的各个数位和。
例如,如果小蓝开始时的数为 23,则下一分钟变为 23−(2+3)=18,再下一分钟变为 18−(1+8)=9,再下一分钟变为 9−9=0,共经过了 3 分钟变为 0。
给定一个正整数,请问这个数多少分钟后变为 0。
输入格式
输入一行包含一个整数 n。
输出格式
输出一个整数,表示答案。
样例输入
23
样例输出
3
评测用例规模与约定
对于 30% 的评测用例,1≤n≤1000;
对于 60% 的评测用例,1≤n≤10^6;
对于所有评测用例,1≤n≤10^9。
运行限制
| 语言 | 最大运行时间 | 最大运行内存 |
|---|---|---|
| C++ | 1s | 256M |
| C | 1s | 256M |
| Java | 2s | 256M |
| Python3 | 3s | 256M |
| PyPy3 | 3s | 256M |
| Go | 3s | 256M |
| JavaScript | 3s | 256M |
代码思路
import java.util.Scanner;public class Main3 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int t = 0;while (n != 0) {t++;n -= getsum(n);}System.out.println(t);}static int getsum(int n) {int sum = 0;while (n != 0) {sum += n % 10;n /= 10;}return sum;}
}
定时任务
问题描述
Cron 表达式在定时任务中经常被使用,在这里我们用了一种简化后的版本 SimpleCron 表达式:SimpleCron 表达式是一个具有时间含义的字符串,字符串以 4 个空格隔开,分为 5 个域,格式为 XXXXX,其中 X 是一个域的占位符。5 个域从左至右依次为秒 (0−59)、分钟 (0−59)、小时 (0−23)、日期 (1−31)、月份 (1−12),其中括号内为他们各自的取值范围。同时域内取值也可以使用一些特殊字符(每个域内只能使用一种特殊字符):
- 特殊字符 ∗ (ASCII 码为 42)表示所有可能的值。例如:在分钟域内表示每一分钟;在日期域内表示月内的每一天。
- 特殊字符 , (ASCII 码为 44)表示列出枚举值。例如:在秒域内,3,20 表示分别在 3 秒和 20 秒执行一次任务。
- 特殊字符 − (ASCII 码为 45)表示范围,可以视为连续的若干个枚举值。例如:1−5 等价于 1,2,3,4,5。
例如,421,3,151−31∗表示的含义是每个月份中的每一天中的 01:02:04、03:02:04、15:02:04 这三个时刻各执行一次,在 2023 年一共会执行 1095 次。
现在给出你一个合法的 SimpleCron 表达式,其中用到的所有数字均没有前导零。请问在 2023 一整年当中,使用了这个表达式的定时任务总计会执行多少次?
输入格式
输入一行,包含一个 SimpleCron 字符串。
输出格式
输出一行,包含一个整数表示答案。
样例输入
4 2 1,3,15 1-31 *
样例输出
1095
评测用例规模与约定
对于所有评测用例,0≤ 秒域的取值 ≤59,0≤ 分钟域的取值 ≤59,0≤ 小时域的取值 ≤23,1≤ 日期域的取值 ≤31,1≤ 月份域的取值 ≤12。
运行限制
| 语言 | 最大运行时间 | 最大运行内存 |
|---|---|---|
| C++ | 1s | 256M |
| C | 1s | 256M |
| Java | 2s | 256M |
| Python3 | 3s | 256M |
| PyPy3 | 3s | 256M |
| Go | 3s | 256M |
| JavaScript | 3s | 256M |
代码思路
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Scanner;public class Main4 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String array[] = scanner.nextLine().split(" ");ArrayList<Integer> list[] = new ArrayList[5];int num[] = { 60, 60, 24, 32, 13 };int ans = 0;for (int i = 0; i < array.length; i++) {list[i] = new ArrayList<Integer>();if (array[i].contains("*")) {for (int j = i < 3 ? 0 : 1; j < num[i]; j++) {list[i].add(j);}} else if (array[i].contains(",")) {String array2[] = array[i].split(",");for (int j = 0; j < array2.length; j++) {list[i].add(Integer.parseInt(array2[j]));}} else if (array[i].contains("-")) {String array2[] = array[i].split("-");int temp1 = Integer.parseInt(array2[0]);int temp2 = Integer.parseInt(array2[1]);for (int j = temp1; j <= temp2; j++) {list[i].add(j);}} else {list[i].add(Integer.parseInt(array[i]));}}for (int i : list[4]) {for (int j : list[3]) {try {LocalDate localDate = LocalDate.of(2023, i, j);ans++;} catch (Exception e) {// TODO: handle exception}}}ans *= list[0].size() * list[1].size() * list[2].size();System.out.println(ans);}
}
