一、分析
1.string到int和int到string的转换函数(int到string时最后记得翻转string)
2.提取出输入内容的年月日
3.枚举日期(年从输入的year到9999,月从1到12,日从1到31,年相等月小的不要,年相等月相等日小于等于的不要)
4.判断是否为合法日期(用数组)
5.判断是否回文(a[i]==a[a.length()-i-1;遍历长度为i<a.length()/2)
6.判断是否是ABABBABA类型(先必须是回文,然后a[0]==a[2], a[1]==a[3])
二、新学到的知识点
1.用cout<<setfill('0')<<setw(宽度)来实现输出整数时宽度不够左边补0
2.整数加'0’可以转为char类型的数
三、代码
#include <bits/stdc++.h>
using namespace std;
//11:00 回文日期
int string2int(string s){
int result=0;
for(const auto&i:s){
result=result*10+i-'0';
}
return result;
}
string int2string(int x){
string result="";
while(x){
int shu=x%10;
char y=shu+'0';
result=result+y;
x/=10;
}
reverse(result.begin(),result.end());
return result;
}
bool checkislegal(int year,int month,int day){
//各月的天数
int legalday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//是否闰年
if(year%400==0||year%4==0&&year%100!=0){
legalday[2]=29;
}
if(legalday[month]<day)return false;
return true;
}
bool checkishuiwen(string s){
for(int i=0;i<s.length()/2;i++){
if(s[i]!=s[s.length()-i-1])return false;
}
return true;
}
bool checkisabab(string s){
if(!checkishuiwen(s))return false;
if(s[0]==s[2]&&s[1]==s[3])return true;
else return false;
}
int main(){
//输入日期
string s;
cin>>s;
int year,month,day;
//提取日期
year=string2int(s.substr(0,4));
month=string2int(s.substr(4,2));
day=string2int(s.substr(6,2));
//枚举日期
int flaghuiwen=0;
int flagabab=0;
for(int i=year;i<=9999;i++){
for(int j=1;j<=12;j++){
for(int k=1;k<=31;k++){
//输入日期及其之前的不可取
if(i==year&&j<month)continue;
if(i==year&&j==month&&k<=day)continue;
//找出满足要求的
if(!checkislegal(i,j,k)) continue;//不是合法日期不行
if(checkishuiwen(int2string(i*10000+j*100+k))){
if(flaghuiwen==0)
{
cout<<setfill('0')<<setw(4)<<i;
cout<<setfill('0')<<setw(2)<<j;
cout<<setfill('0')<<setw(2)<<k;
flaghuiwen=1;
cout<<endl;
}
}
if(checkisabab(int2string(i*10000+j*100+k))&&flaghuiwen){
if(flagabab==0){
cout<<setfill('0')<<setw(4)<<i;
cout<<setfill('0')<<setw(2)<<j;
cout<<setfill('0')<<setw(2)<<k;
flagabab=1;
return 0;
}
}
}
}
}
return 0;
}