//回文日期 //思路:月和日是有限的,已知月日推年份,枚举第一天到第366天,转化为月日形式,再去推年份,然后合并起来变成整数存起来排序 #include <bits/stdc++.h> using namespace std; int calendar[400];//打表 int reserve(int x)//将一个数颠倒,因为这里的数字范围是1~31,用switch { switch (x) { case 1:return 10;break; case 2:return 20;break; case 3:return 30;break; case 4:return 40;break; case 5:return 50;break; case 6:return 60;break; case 7:return 70;break; case 8:return 80;break; case 9:return 90;break; default:return x%10*10+x/10; } } void transform(int x)//将第x天转化为对应的年月日,然后存在数组calendar中 { int m,d,year;//日,月 if(x>0&&x<=31) m=1;//先转化月 else if(x>31&&x<=60) m=2; else if(x>60&&x<=91) m=3; else if(x>91&&x<=121) m=4; else if(x>121&&x<=152) m=5; else if(x>152&&x<=182) m=6; else if(x>182&&x<=213) m=7; else if(x>213&&x<=244) m=8; else if(x>244&&x<=274) m=9; else if(x>274&&x<=305) m=10; else if(x>305&&x<=335) m=11; else if(x>335&&x<=366)m=12; switch (m) { case 1:d=x;break; case 2:d=x-31;break; case 3:d=x-31-29;break; case 4:d=x-31-29-31;break; case 5:d=x-31-29-31-30;break; case 6:d=x-31-29-31-30-31;break; case 7:d=x-31-29-31-30-31-30;break; case 8:d=x-31-29-31-30-31-30-31;break; case 9:d=x-31-29-31-30-31-30-31-31;break; case 10:d=x-31-29-31-30-31-30-31-31-30;break; case 11:d=x-31-29-31-30-31-30-31-31-30-31;break; case 12:d=x-31-29-31-30-31-30-31-31-30-31-30;break; } calendar[x]=reserve(d)*1000000+reserve(m)*10000+m*100+d; } bool cmp(int x,int y) { return x<y; } int main()//定义转化天数为日期的函数 { int n,x,i,y; cin>>x>>y;//输入开始和截止日期 for(i=1;i<=366;i++) { transform(i);//把每一天都转化为对应的年月日 } sort(calendar+1,calendar+366+1,cmp);//对枚举出来的回文日期进行排序 int p,q;//标记开始和截止日期,定义前后指针,对回文日期数组检索 int flag1=0,flag2=0;//指针是否移动到对应位置了 for(i=1;i<=366;i++) { if(x<=calendar[i]&&!flag1) {flag1=1;p=i;} if(y<calendar[i]&&!flag2) {flag2=1;q=i;} } if(!flag1) {cout<<"0"<<endl;return 0;}//若前指针移到最后还找不到,说明没有回文日期 else if(!flag2) q=367;//若后指针移到最后一个回文日期外,将后指针移到最后一个回文日期上 cout<<q-p<<endl;//输出区间的回文日期数量 }