一、题意分析:
二、思路分析:
一道大模拟题, 核心难点主要在于检查日期的合法性. 也要注意不能低于日期的下限, 即题目给出的数据.
三、AC Code:
#include <bits/stdc++.h>
using namespace std;
int n;
bool check(int year, int month, int day) {
if (day <= 0) return false; // 非法日期
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { // 大月
return day <= 31;
} else if (month == 4 || month == 6 || month == 9 || month == 11) { // 小月
return day <= 30;
} else if (month == 2) { // 2月
if (year % 4 == 0) { // 闰年
return day <= 29;
} else { // 平年
return day <= 28;
}
} else { // 非法月份
return false;
}
}
int main() {
scanf("%d", &n);
int year = n / 10000 + 1;
// 构造回文日期
for (; ; year++) {
int month = year % 10 * 10 + year / 10 % 10, day = year / 100 % 10 * 10 + year / 1000;
if (check(year, month, day)) {
int date = year * 10000 + month * 100 + day;
if (date >= n) {
printf("%d%02d%02d\n", year, month, day);
break;
}
}
}
// 构造ABABBABA
year = n / 10000 + 1;
for (; ; year++) {
if ((year % 10 == year / 100 % 10) && (year / 10 % 10 == year / 1000 % 10)) {
int A = year / 10 % 10, B = year % 10;
int tmp = B * 10 + A;
if (check(year, tmp, tmp)) {
int date = year * 10000 + tmp * 100 + tmp;
if (date >= n) {
printf("%d%02d%02d\n", year, tmp, tmp);
break;
}
}
}
}
return 0;
}