回文日期
https://www.acwing.com/problem/content/description/2870/
这题的关键就是日期合法性的判别,根据年份按照回文规则判断月份是否合法、天数是否合法,天数的判别又涉及到闰年的判断
#include<bits/stdc++.h>
using namespace std;
int maxday(int year,int mon){
//找到该年该月的天数
switch(mon){
case 2://二月天数取决于是否是闰年
if((year%4==0 && year%100==1)|| year%400==0)
return 29;//闰年29天
else
return 28;//平年28天
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
default:
return 30;
}
}
void print(int y,int m,int d){
cout<<y;
if(m<10)
cout<<"0"<<m;
else
cout<<m;
if(d<10)
cout<<"0"<<d<<endl;
else
cout<<d<<endl;
}
int main(){
int y,m,d;
scanf("%4d%2d%2d",&y,&m,&d);
// cout<<maxday(2020,4);
int flag1=0;
for(int i=y;;i++){
int nm=i%10*10+i/10%10;
int nd=i/100%10*10+i/1000;
if(i>y){
//不是同一年
if(nm<=12 && nm>=1 && nd<=maxday(i,nm)){
if(flag1==0){
//普通回文
print(i,nm,nd);
flag1=1;
}
if(i/1000==i/10%10 && i/100%10==i%10){
//ABAB型
print(i,nm,nd);
break;
}
}
}
else{
//同一年
if((nm>m && nm<=12 && nd<=maxday(y,m))|| (nm==m && nd>d && nd<=maxday(y,m))){
if(flag1==0){
//普通回文
print(i,nm,nd);
flag1=1;
}
if(i/1000==i/10%10 && i/100%10==i%10 && i/1000 !=i/100%10){
//ABAB型
print(i,nm,nd);
break;
}
}
}
}
return 0;
}