2021寒假每日一题《回文日期》
回文日期
题目来源:第十一届蓝桥杯省赛第二场C++A/B组
时间限制:\(1000ms\) 内存限制:\(256mb\)
题目描述
2020 年春节期间,有一个特殊的日期引起了大家的注意:\(2020 年 2 月 2 日\) 。
因为如果将这个日期按 yyyymmdd
的格式写成一个 8 位数是 20200202
,恰好是一个回文数。
我们称这样的日期是回文日期。
有人表示 20200202
是“千年一遇” 的特殊日子。
对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202
即 \(2021 年 12 月 2 日\) 。
也有人表示 20200202
并不仅仅是一个回文日期,还是一个 ABABBABA
型的回文日期。
对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA
型的回文日期:21211212
即 \(2121 年 12 月 12 日\) 。
算不上“千年一遇”,顶多算“千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA
型的回文日期各是哪一天。
输入格式
输入包含一个八位整数 \(N\),表示日期。
输出格式
输出两行,每行 \(1\) 个八位数。
第一行表示下一个回文日期,第二行表示下一个 ABABBABA
型的回文日期。
数据范围
对于所有评测用例,\(10000101≤N≤89991231\) ,保证 N 是一个合法日期的 8 位数表示。
样例输入
20200202
样例输出
20211202
21211212
解题思路
需要给出输入日期的 下一个回文日期 和 下一个 ABABBABA
型的日期 。
所以从输入的数开始,每次循环+1。
用 date
表示输入的数。
输出的第一个数,需要判断 date
是否为合法日期和回文数。
输出的第二个数,除了需要上面的判断外,还需要判断是否为 ABABBABA
型的数。
一、判断是否为合法日期
判断一个数是否为合法日期,只需要看月份和天数是否能够合法,比如:
1、3、5、7、8、10、12月,有31天;
4、6、9、11月,有30天;
2月 需要单独进行判断,如果年份为 闰年 ,2月有29天,否则2月只有28天。
二、判断是否为回文数
将数字转化为字符串,定义两个指针,分别在左端和右端。
判断左右两端的字符是否一样,如果一样则左右指针都向内移动一位,依次进行判断。
只要有一位不相同,就可以直接返回 false
。
两个指针相遇的时候,代表字符串内的全部字符已经比较完毕,没有需要不相同的,返回 true
。
三、判断 ABABBABA 型数
只需判断字符串的第 \(0,2,5,7\) 位是否相同,和字符串的第 \(1,3,4,6\) 位是否相同,且第 \(0,1\) 位不相同。
结束程序在输出两个数之后,可以使用两个 boolean
型的变量存放输出的状态,两个数都输出之后结束循环。
解题代码-Java
import java.util.Scanner;
public class Main {
static boolean check(int n) {
String s = Integer.toString(n);
int l = 0, r = s.length() - 1;
while (l < r) {
if (s.charAt(l) != s.charAt(r)) {
return false;
}
l++;
r--;
}
return true;
}
static boolean checkDate(int n) {
String s = Integer.toString(n);
int year = Integer.parseInt(s.substring(0, 4));
int month = Integer.parseInt(s.substring(4, 6));
int day = Integer.parseInt(s.substring(6, 8));
if (month <= 0 || month > 12) {
return false;
}
if (day <= 0) {
return false;
}
switch (month) {
case 2:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
if (day > 29) {
return false;
}
} else {
if (day > 28) {
return false;
}
}
break;
case 4:
case 6:
case 9:
case 11:
if (day > 30) {
return false;
}
break;
default:
if (day > 31) {
return false;
}
break;
}
return true;
}
static boolean checkABABBABA(int n) {
char[] s = Integer.toString(n).toCharArray();
return s[0] == s[2] && s[0] == s[5] && s[0] == s[7] && s[1] == s[3] && s[1] == s[4] && s[1] == s[6] && s[0] != s[1];
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int date = input.nextInt() + 1;
input.close();
boolean flag1 = false, flag2 = false;
while (!flag1 || !flag2) {
if (!check(date)) {
date++;
} else if (!checkDate(date)) {
date++;
} else if (!flag1) {
System.out.println(date);
flag1 = true;
} else if (!checkABABBABA(date)) {
date++;
} else if (!flag2) {
System.out.println(date);
flag2 = true;
}
}
}
}