题目描述
2020
年春节期间,有一个特殊的日期引起了大家的注意:2020
年 2
月 2
日。
因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8
位数是 20200202,恰好是一个回文数。
我们称这样的日期是回文日期。
有人表示 20200202 是“千年一遇” 的特殊日子。
对此小明很不认同,因为不到 2
年之后就是下一个回文日期:20211202 即 2021
年 12
月 2
日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。
对此小明也不认同,因为大约 100
年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121
年 12
月 12
日。
算不上“千年一遇”,顶多算“千年两遇”。
给定一个 8
位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
样例
#include<bits/stdc++.h>
using namespace std;
bool judge1(int f[9]){//判断是否是回文串
int l=1,r=8;
while(l<r){
if(f[l]!=f[r])return false;
l++;
r--;
}
return true;
}
int judge2(int f[9],int x){//判断是否是合法日期
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义月份
int year=x/10000,month=x%10000/100,date=x%100;
if((year%4==0&&year%100!=0)||year%400==0)day[2]=29;//判断是否是闰年
else day[2]=28;//二月是特殊的
if(month>12||date>day[month])return 0;//不是合法日期则返回0
else return 1;
}
int main(){
int x;
cin>>x;
bool st1=true,st2=true;
for(int i=x+1;i<=x+11000000;i++){
int cnt=1,n=i,f[9];
while(n){//这里是对数进行拆分
f[cnt++]=n%10;
n/=10;
}
if(judge1(f)){//判断是否是回文串
if(judge2(f,i)&&st1){//判断普通回文
cout<<i<<endl;
st1=false;
}
if(judge2(f,i)&&st2){//判断ababbaba类型
if(f[1]==f[3]&&f[2]==f[4]&&f[2]!=f[1]){
cout<<i<<endl;
st2=false;
}
}
}
}
return 0;
}
–