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

Day2

第一题

第四届2013年蓝桥杯省赛

排它平方数

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
    }
}

你可能感兴趣的:(#,刷题笔记,蓝桥杯,java,算法,职场和发展)