• 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 }
  • 相关阅读:
    AtCoder Beginner Contest 250
    Codeforces Round #786 (Div. 3)
    Codeforces Round #787 (Div. 3)
    Educational Codeforces Round 128 (Rated for Div. 2)
    OpenSSL测试大数
    大数库GMP测试
    实验一密码引擎商用密码算法实现2交叉测试(选做)
    数据转换16进制字符
    NOI 2021 题目选做
    NOI 2017 题目选做
  • 原文地址:https://www.cnblogs.com/zkw666/p/12722352.html
Copyright © 2020-2023  润新知