P2010 回文日期
呃呃呃,这个题我写的代码比较繁琐,不过自认为还是很容易理解的。
输入的是两个日期,如果把它看成一个数的话,数据范围也就是10000000-99999999;而且在其中很多数是不会出现的(必须是真实存在的日期)如果是从输入的第一个数到第二个数循环一次的话,1s的时间限制也是能过的,循环的时候,要判断这个数是否是回文数,再判断这个数是否为合法的日期。所以再定义两个函数分别判断就可以了。
首先是判断日期是否合法的函数:
1 bool hf(int a) 2 { 3 int t=a,date,year; 4 year=t/10000; 5 t=t%10000; 6 date=t%100; 7 t=t/100; 8 if(t<1 || t>12) return false; 9 if(t==1||t==3||t==5||t==7||t==8||t==10||t==12) 10 { 11 if(date>31 || date<1) return false; 12 else return true; 13 } 14 if(t==4||t==6||t==9||t==11) 15 { 16 if(date>30 || date<1) return false; 17 else return true; 18 } 19 if(t==2) 20 { 21 if((year%4==0 && year%100!=0) || year%400==0) 22 { 23 if(date>29 || date<1) return false; 24 else return true; 25 } 26 else 27 { 28 if(date>28 || date<1) return false; 29 else return true; 30 } 31 } 32 }
返回值只需要“true”或“false”就可以了,所以函数类型就是bool型,下面判断回文的函数也一样。三个变量:year来存储年份,t来存储月份,date来存储日期。分别存好后,先判断月份,首先月份要是不合法的话就直接返回false;然后再根据每个月份所对应的最多天数来判断是否合法。其中2月份比较特殊,先要判断是闰年还是平年,再判断日期是否合法。
然后,判断是否为回文数的函数:
1 bool hw(int a) 2 { 3 if(a/10000000==a%10 && a/1000000%10==a%100/10 && a/100000%10==a%1000/100 && a/10000%10==a%10000/1000) 4 { 5 return true; 6 } 7 else return false; 8 }
判断回文的话就直接将后四位数翻转过来,再判断是否和前四位数相等,若相等,则为回文数。
然后main函数里进行循环和调用函数就可以了。
AC代码:
1 #include<iostream> 2 using namespace std; 3 bool hf(int a) 4 { 5 int t=a,date,year; 6 year=t/10000; 7 t=t%10000; 8 date=t%100; 9 t=t/100; 10 if(t<1 || t>12) return false; 11 if(t==1||t==3||t==5||t==7||t==8||t==10||t==12) 12 { 13 if(date>31 || date<1) return false; 14 else return true; 15 } 16 if(t==4||t==6||t==9||t==11) 17 { 18 if(date>30 || date<1) return false; 19 else return true; 20 } 21 if(t==2) 22 { 23 if((year%4==0 && year%100!=0) || year%400==0) 24 { 25 if(date>29 || date<1) return false; 26 else return true; 27 } 28 else 29 { 30 if(date>28 || date<1) return false; 31 else return true; 32 } 33 } 34 } 35 bool hw(int a) 36 { 37 if(a/10000000==a%10 && a/1000000%10==a%100/10 && a/100000%10==a%1000/100 && a/10000%10==a%10000/1000) 38 { 39 return true; 40 } 41 else return false; 42 } 43 int main() 44 { 45 int m,n,s=0; 46 cin>>m>>n; 47 for(int i=m;i<=n;++i) 48 { 49 if(hf(i) && hw(i)) 50 { 51 s++; 52 } 53 } 54 cout<<s; 55 return 0; 56 }