回文日期—题解
题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1974
方法一:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int i,j,y,m,d,t,date1,date2,sum=0; 6 //i,j循环变量,y对应日期,m月倒置的数值,d日倒置的数值 7 int ms[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; 8 cin>>date1>>date2;//输入起始结束日期 9 for (i=1;i<=12;i++) 10 { 11 m=i%10*10+i/10;//1-12月份倒置之后的值 12 t=ms[i]; 13 for (j=1;j<=t;j++) 14 { 15 d=j%10*10+j/10;//1-t日倒置之后的值 16 y=(d*100+m)*10000+i*100+j;//对应回文的日期 17 if(y>=date1&&y<=date2) 18 sum++;//判断这个日期在不在查询范围内 19 } 20 } 21 cout<<sum<<endl; 22 return 0; 23 }
方法二:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int date1,date2,ans=0; 6 int ms[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//列出每个月份对应的最大天数,注意2月份用最大29天 7 cin>>date1>>date2;//输入起始结束日期 8 d1=date1/10000, d2=date2/10000; //求出前四位,用年份枚举就可以 9 for(int i=d1; i<=d2; i++){ //枚举前四位年份,然后转换成月和天 10 int month=i%10*10+i/10%10; //将i后两位转换成月份 11 int day=i/100%10*10+i/1000; //将i前两位转换成天 12 if(month<13 && ms[month]>=day)//判断月份是否合法&&天是否合法(通过上面一维数组查询) 13 ans++; 14 } 15 cout<<ans<<endl; 16 return 0; 17 }
注意:本题不需要判断平年和润年2月份的问题,题目中已经给出提示所给年份均为合法真是日期。关于平年闰年的描述其实是为了干扰做题者,所以认真审题和分析,获取有用的信息,在竞赛中尤为重要。