#|蓝桥杯31天冲刺打卡题解(Day2)

Day2 第一题 第四届2013年蓝桥杯省赛
排它平方数
【#|蓝桥杯31天冲刺打卡题解(Day2)】C++A组第二题
填空题
暴力
利用了排序,及循环标签的使用技巧,循环标签的使用可参考 快递e栈(控制台简易版)——异常处理 的文末。
暴力枚举每一位判断。

import java.util.Arrays; public class Main { public static void main(String[] args) { outer: // 循环标签 for (int i = 203891; i < 987654; i++) { // 根据每一位不相同 且数字是6位数写出i的区间 String num = String.valueOf(i); char[] arr = num.toCharArray(); Arrays.sort(arr); // 排序过后,相同数字必定挨在一起 for (int j = 0; j < arr.length - 1; j++) { if (arr[j] == arr[j + 1]) continue outer; // 返回到最外层for循环 }long i_pow = (long)i * i; // 记录i*i String pow_number = String.valueOf(i_pow); char[] arr_pow = pow_number.toCharArray(); for (int j = 0; j < arr_pow.length; j++) { for (int k = 0; k < arr.length; k++) { if (arr_pow[j] == arr[k]) continue outer; // 返回到最外层for循环 } } System.out.print(i); } } }

第二题 第四届2013年蓝桥杯省赛
买不到的数目
题解在我之前写的文章的第一题: 蓝桥杯AcWing学习笔记 3-1数学的学习
三种方法,写的很详细,暴力枚举,打表找规律,数学公式都有写。
第三题 第十一届2020年蓝桥杯省赛
回文日期
C++B组第7题
模拟
按照题意模拟即可。
import java.util.Scanner; public class Main { static int[] days = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int flag = 0; // date的范围可以不写 如果写的话一定要写成99999999 题里的89991231是n的范围而不是我们求回文日期的范围 for (int date = n + 1; date <= 99999999; date++) { if (!check_valid(date)) continue; // 非法 if (flag == 0 && check_palindrome(date)) { // 找到下一个回文日期 System.out.println(date); flag = 1; } if (check_AB(date)) { // 找到AB型的回文日期 System.out.println(date); break; } } }// 判断日期是否回文 private static boolean check_palindrome(int date) { String str = Integer.toString(date); StringBuffer sb = new StringBuffer(str.substring(4)); if (str.startsWith(sb.reverse().toString())) { return true; } return false; }// 判断日期是否为AB型回文串 private static boolean check_AB(int date) { String str = Integer.toString(date); char[] arr = str.toCharArray(); int a = str.charAt(0), b = str.charAt(1); if(a == b) return false; return arr[2] == a && arr[5] == a && arr[7] == a && arr[3] == b && arr[4] == b && arr[6] == b; }// 判断日期是否合法 private static boolean check_valid(int date) { int year = date / 10000; int month = date % 10000 / 100; int day = date % 100; if (month == 0 || month > 12) return false; // 判断平年 if (day == 0 || month != 2 && day > days[month]) return false; // 判断闰年 if (month == 2) { int leap = 0; // 0表示平年 1表示闰年 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) leap = 1; if (day > 28 + leap) return false; } return true; } }

第四题 第九届2018年蓝桥杯国赛
约瑟夫环
C++A组第4题
递推
f[i]表示有i个人参加游戏时,出局人的编号。
当有人报数到k时,此时人数-1,那么问题就转变成有i - 1个人参加游戏,下一个报数的人即为f[i - 1]
原编号与新编号相差k,所以f[i] = f[i - 1] + k,但我们不能超过i,我们还要%i取余。
import java.util.Scanner; public class Main { static final int N = 1000010; static int[] f = new int[N]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); for (int i = 1; i <= n; i++) f[i] = (f[i - 1] + k) % i; System.out.print(f[n] + 1); // 编号从1开始 所以要+1 } }

    推荐阅读