法1:枚举日期(直接做法)
时间复杂度较高$365*(9999-1000)*4=1.3*10^7$
实测400ms
#include<iostream>
using namespace std;
int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int x){
int a[9]={0},i=0;
while(x){
a[i++]=x%10;
x/=10;
}
for(int j=0;j<=3;j++){
if(a[j]!=a[7-j]) return false;
}
return true;
}
int f(int d1,int m1,int y1){
if(y1%4==0&&y1%100!=0||y1%400==0) d[2]=29;
else d[2]=28;
d1++;
if(d1==d[m1]+1) d1=1,m1++;
if(m1==13) m1=1,y1++;
return y1*10000+m1*100+d1;
}
int main(){
int date1,date2;
cin >> date1 >> date2;
int ans=0;
while(date1<=date2){
if(check(date1)) ans++;
int y1=date1/10000;
int m1=date1/100%100;
int d1=date1%100;
date1=f(d1,m1,y1);
}
cout << ans;
return 0;
}
法2:枚举回文数
只需枚举1000~9999的数,再判断是否符合即可,时间复杂度肉眼可见的小
实测28ms
#include<iostream>
using namespace std;
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int date1,date2;
bool check(int y,int m,int d){
if(y%4==0&&y%100!=0||y%400==0) day[2]=29;
else day[2]=28;
int date=y*10000+m*100+d;
if(m>=1&&m<=12) if(d>=1&&d<=day[m]) if(date>=date1&&date<=date2) return true;
return false;
}
int main(){
cin >> date1 >> date2;
int y1=date1/10000,y2=date2/10000;
int ans=0;
for(int i=y1;i<=y2;i++){
int mi=i%10*10+i%100/10;
int di=i%1000/100*10+i/1000;
if(check(i,mi,di)) ans++;
}
cout << ans;
return 0;
}