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 }
posted @ 2020-04-17 20:46  zkw666  阅读(148)  评论(0编辑  收藏  举报