上一题:蓝桥杯2020年真题演练——6、成绩分析(JavaA组)
题目描述
解析
⭐⭐依次从输入的日期开始遍历直到99999999(8个9),当然既然已知这串数字代表日期,那么遍历到99991231就可以了,日期最大就是1231嘛,不过这些都是些无关紧要的,影响不大,不需要把精力放到这里。对每一个遍历对象首先检查其日期合法性,如果它是一个日期,再进一步检查它是否是回文日期,是否是ABABBABA日期。
注意:我们在遍历的时候要从输入日期的下一个日期开始(因为题目要求的是下一个回文日期)
⭐⭐代码中频繁用到了“%”和“/”,它们分别是取余操作和除法操作,由他俩配合使用可以获取一个整数某位或某几位上的数字。
🌙关于检查日期合法性:要注意不同月份,天数不一样,还要考虑闰年2月的天数是29
🌙检查日期通过后直接取出各位上的数字进行比对,判断其是否是回文日期,若是则输出,输出后进一步判断是否是ABABBABA日期。这里有一个要注意的是,当再次检查到回文日期时,不需要再输出,所以要有一个flag来标识回文日期是否已经输出过了。
代码解析
public class Main {
public static void main(String[] args) {
boolean flag=false;//标记是否已经输出回文日期
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
for (int i = n + 1; i < 99991231; i++) {
if (!check(i)) {
continue;
}
//检查是否是回文
if(i/10000000 ==i%10&&i/1000000%10==i/10%10&&i/100000%10==i/100%10&&i/10000%10==i/1000%10){
if(!flag){
System.out.println(i);
flag=true;
}
//检查该回文是否符合ABABBABA
int A=i/10000000;
int B=i/1000000%10;
if(A!=B&&i/100000%10==A&&i/10000%10==B&&i/1000%10==B&&i/100%10==A&&i/10%10==B&&i%10==A){
System.out.println(i);
break;
}
}
}
}
//检查日期合法性
public static boolean check(int x) {
int year = x / 10000;
int month = x / 100 % 100;
int date = x % 100;
int DATE = 31;
if (month == 4 || month == 6 || month == 9 || month == 11) {
DATE = 30;
} else if (month == 2) {
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
DATE = 29;
} else {
DATE = 28;
}
}
boolean flag = true;
if (month < 1 || month > 12) {
flag = false;
} else if (date < 1 || date > DATE) {
flag = false;
}
return flag;
}
}
蓝桥杯2020年真题演练——8、字串分值(JavaA组)