题目描述
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA
型的回文日期各是哪一天。
样例输入
20200202
样例输出
20211202
21211212
C++代码
#include <iostream>
#include <cstring>
using namespace std;
int y, a[8], b[8], c[8];
bool flag1, flag2;
int dd[] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};
void output(int a[]){
for(int i = 0; i < 8; i ++)
printf("%d", a[i]);
puts("");
}
bool check1(){
for(int l = 0, r = 7; l <= r; l ++, r --){
if(a[l] != a[r]) return false;
}
return true;
}
// 满足ABABBABA型回文日期,还需保证AB二者是不同的
bool check2(){
if(check1() == 0) return false;
return a[0] == a[2] && a[1] == a[3] && a[0] != a[1];
}
bool is_leap(int y){
return y % 100 && y % 4 == 0 || y % 400 == 0;
}
// 判断日期是否合法
bool is_legal(int n){
int month = (n / 100) % 100;
if(month > 12 || month < 1) return false;
int day = n % 100;
int year = n / 10000;
if(month == 2 && is_leap(year))
return day <= dd[2] + 1;
else return day <= dd[month % 12];
}
int main(void){
scanf("%d", &y);
for(int i = y + 1; ; i ++){
if(! is_legal(i)) continue;
int t = i;
for(int j = 0; j < 8; j ++){
a[j] = t % 10;
t /= 10;
}
if(!flag1 && check1()) memcpy(b, a, sizeof a), flag1 = true;
if(!flag2 && check2()) memcpy(c, a, sizeof a), flag2 = true;
if(flag1 && flag2) break;
}
output(b), output(c);
return 0;
}