回文日期
題目來源:第十一屆藍橋杯省賽第二場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;
}
}
}
}
