算法知识点: 枚举,模拟

复杂度:

解题思路:

由于只有八位数,而且回文串左右对称,因此可以只枚举左半边,这样只需枚举 总共一万个数,然后判断:

  • 整个八位数构成的日期是否合法;
  • 是否在范围内

C++ 代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
 
int months[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
bool check(int date)
{
    int year = date / 10000;
    int month = date % 10000 / 100;
    int day = date % 100;
 
    if (!month || month > 13 || !day) return false;
 
    if (month != 2 && day > months[month]) return false;
    if (month == 2)
    {
        bool leap = year % 4 == 0 && year % 100 || year % 400 == 0;
        if (day > 28 + leap) return false;
    }
 
    return true;
}
 
int main()
{
    int date1, date2;
    cin >> date1 >> date2;
 
    int res = 0;
    for (int i = 0; i < 10000; i++)
    {
        int x = i, r = i;
        for (int j = 0; j < 4; j++) r = r * 10 + x % 10, x /= 10;
 
        if (r >= date1 && r <= date2 && check(r)) res++;
    }
 
    printf("%d\n", res);
    return 0;
}


另外,牛客暑期NOIP真题班限时免费报名
报名链接:https://www.nowcoder.com/courses/cover/live/248
报名优惠券:DCYxdCJ