8位数能表示的最大时间为99991231 N最小为10000101,枚举次数最坏情况下为10^7 接近于10^8 程序是可以接受的
So...........
暴力枚举就完事了
这里用了 sprintf 将数字转化为了字符数组表示,是十分的方便亚呼呼
C++ 代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <string>
#include <deque>
using namespace std;
const int ymax=9999;
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
int n,yy,mm,dd;
bool flag;
int isRun(int y){
if(y%400==0 ||( y%4==0 && y%100!=0)) return 1;
return 0;
}
bool myfun1(int y,int m,int d){
char str[20];
sprintf(str,"%d",y);
sprintf(str+4,"%02d",m);
sprintf(str+6,"%02d",d);
for(int i=0,j=7;i<j;i++,j--){
if(str[i]!=str[j]) return false;
}
return true;
}
bool myfunAB(int y,int m,int d){
char str[20];
sprintf(str,"%d",y);
sprintf(str+4,"%02d",m);
sprintf(str+6,"%02d",d);
if(str[0]==str[2] && str[1]==str[3] && str[0]!=str[1]) return true;
return false;
}
int main(){
cin>>n;
dd=n%100+1,n/=100;
mm=n%100,n/=100;
yy=n;
while(yy<ymax || mm<12 || dd<31){
if(dd>month[mm][isRun(yy)]){
dd=1;
mm++;
}
if(mm>=13){
mm=1;
yy++;
}
if(!flag && myfun1(yy,mm,dd)){
printf("%d%02d%02d\n",yy,mm,dd);
flag=true;
}
if(myfun1(yy,mm,dd) && myfunAB(yy,mm,dd)){
printf("%d%02d%02d\n",yy,mm,dd);
break;
}
dd++;
}
return 0;
}