466. 回文日期
题目链接https://www.acwing.com/problem/content/468/
题目:
思路:就是 先枚举出年,然后根据回文特点补充月日,然后判断日期是否合法,时间复杂度为0(104),如果枚举从st到ed,时间复杂度为0(108),会超时,这两个代码我都贴上
10^4的代码:
#include<iostream>
#include<cstdio>
using namespace std;
int st,ed;
int month[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool pd(int u){
int ye=u/10000;
int mon=u%10000/100;
int day=u%100;
if(mon<1||mon>12||day<1) return false;
if(mon==2){
int f=0;
if(ye%400==0||ye%4==0&&ye%100!=0)
f=1;
if(day>month[2]+f) return false;
}
else{
if(month[mon]<day) return false;
}
return true;
}
int main(){
cin>>st>>ed;
int ans=0;
for(int i=1000;i<10000;i++){
int x=i,y=i;
while(x){
y=y*10+x%10;
x/=10;
}
if(y>=st&&y<=ed&&pd(y)) ans++;
}
cout<<ans;
return 0;
}
10^8的代码:
#include<iostream>
#include<cstdio>
using namespace std;
int st,ed;
int month[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool legall(int u){
int ye=u/10000;
int mon=u%10000/100;
int day=u%100;
if(mon<1||mon>12||day<1) return false;
if(mon==2){
int f=0;
if(ye%400==0||ye%4==0&&ye%100!=0)
f=1;
if(day>month[2]+f) return false;
}
else{
if(month[mon]<day) return false;
}
return true;
}
bool pd(int u){
if(!legall(u)) return false;
int a[10];
for(int i=0;i<8;i++){
a[i]=u%10;
u/=10;
}
for(int i=0;i<4;i++){
if(a[i]!=a[7-i]) return false;
}
return true;
}
int main(){
cin>>st>>ed;
int ans=0;
for(int i=st;i<=ed;i++){
if(pd(i)) ans++;
}
cout<<ans;
return 0;
}