题目:判断题目给的两个日期之间有多少个回文日期
首先,我们可以发现,一年最多只可能有一个回文日期,所以判断给定的两个日期之间的年份有没有对应的回文日期就可以了。
再注意一下题目给的两个日期所对应的年份。对应的回文日期要在时间区间内,即初始年对应的回文日期要在给定日期之后,结束年对应的回文日期在给定日期之前。
#include<iostream> #include<bits/stdc++.h> using namespace std; int M[20]= {0,31,0,31,30,31,30,31,31,30,31,30,31}; bool isLeapyear(int y) { if((y%4==0&&y%100!=0)||y%400==0) { return true; } return false; } bool check(int y) { int m,d; m = (y%10)*10+((y/10)%10); d = ((y/100)%10)*10+((y/1000)%10); if(m==0||d==0||m>12) { return false; } if(m==2) { if(isLeapyear(y)){ M[2]=29;} else if(!isLeapyear(y)){M[2]=28;} } if(d<=M[m]){return true;} else{return false;} } int ReYear(int y) { return (y%10)*1000+((y/10)%10)*100+((y/100)%10)*10+((y/1000)%10); } int main() { int y1,md1; int y2,md2; scanf("%4d%4d",&y1,&md1); scanf("%4d%4d",&y2,&md2); int ans = 0; if(y1!=y2) { bool flag; for(int i = y1+1; i<=y2-1 ; i++)//判断两个日期之间的年份 { int m,d;//取出该年份对应回文日期的月和日 if(check(i)){ans++;} } if(check(y1)&&md1<=ReYear(y1)){ans++;} if(check(y2)&&ReYear(y2)<=md2){ans++;} } else{//在同一年里 int m1,d1;//取出y1年份对应回文日期的月和日 m1 = (y1%10)*10+((y1/10)%10); d1 = ((y1/100)%10)*10+((y1/1000)%10); if(check(y1)&&ReYear(y1)>=md1&&ReYear(y1)<=md2) { ans++; } } cout<<ans<<endl; return 0; }