问题
2020 年春节期间,有一个特殊的日期引起了大家的注意:
2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd”
的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,
因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。
对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:
21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
10000101≤N≤89991231
思路
思路很简单,从N这个日期开始,每天加1,在判断是否是回文日期,或是ABABBABA型的回文日期
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int n;
cin>>n;
string s=to_string(n);
//先加一,防止N恰好是回文日期
int y=n/10000;
int m=n/100%100;
int d=(s[6]-'0')*10+s[7]-'0';
if(y%4==0&&y%100!=0||y%400==0)month[2]=29;
if(d+1>month[m]){
d=1;
m=(m+1)%12;
}
else d+=1;
//用来标记是否找到回文日期和ABABBABA型的回文日期
bool flag1=false,flag2=false;
int ans1,ans2;
while(1){
if(flag1&&flag2)break;//找到跳出循环
//天数加一
if(y%4==0&&y%100!=0||y%400==0)month[2]=29;
else month[2]=28;
d++;
if(d>month[m]){
d=1;
m++;
if(m>12){
m=1;
y++;
}
}
//判断
string s=to_string(y);
reverse(s.begin(),s.end());
int mon=(s[0]-'0')*10+s[1]-'0';
int day=(s[2]-'0')*10+s[3]-'0';
if(mon==m&&day==d){
if(!flag1){
flag1=true;
ans1=y*10000+m*100+d;
}
if(d==m){
flag2=true;
ans2=y*10000+m*100+d;
}
}
}
cout<<ans1<<endl;
cout<<ans2<<endl;
return 0;
}