NC16438 回文日期


题目

  • 原题地址:回文日期
  • 题目编号:NC16438
  • 题目类型:枚举
  • 时间限制:C/C++ 1秒,其他语言2秒
  • 空间限制:C/C++ 262144K,其他语言524288K

1.题目大意

  • 给定起始日期,判断区间内回文日期的个数

2.题目分析

  • 直接按照年份枚举,判断回文日期是否合法、是否在起止时间内即可

3.题目代码

#include 

using namespace std;

int f[13];

int func(int a)
{
    int  b, c, d, e;
    b = a%10;
    c = a/10%10;
    d = a/100% 10;
    e = a/1000%10;
    a = a*10000 + b*1000 + c*100 + d*10 + e;
    return a;
}

bool judege(int b)
{
    int y = b/10000;
    b %= 10000;
    int m, d;
    m = b/100;
    d = b%100;
    if(m>12||d>31||m==0)
        return false;
    else
    {
        if(m==2)
        {
            if((y%4==0&&y%100!=0)||y%400==0)
                if(d>=1&&d<=29)
                    return true;
                else
                    return false;
            else
                if(d>=1&&d<=28)
                    return true;
                else
                    return false;
        }
        else
        {
            f[4] = f[6] = f[9] = f[11] = 1;
            if(f[m])
                if(d>=1&&d<=30)
                    return true;
                else
                    return false;
            else
                if(d>=1&&d<=31)
                    return true;
                else
                    return false;
        }
    }
}

int main() {
    int a, b;
    cin >> a >> b;
    int ans = 0;
    int a1, b1;
    a1 = a/10000;
    b1 = b/10000;
    int tmp;
    for(int i=a1;i<=b1;i++)
    {
        tmp = func(i);
        if(judege(tmp)&&tmp>=a&&tmp<=b)//起止时间内合法的回文日期
            ans++;
    }
    cout << ans << endl;
}