主要思路

关键在枚举对象,从头到尾遍历太莽了,故针对回文数关于中轴左右对称特点,为了降低复杂度,利用年份构造月份与天,再判断构造出的日期是否在左右端点之内

易错点

  1. 构造月份与天用了秦九韶计算多项式的方法

2.构造出的月份不要急着代下标,还要看在不在12个月里,不然会越界

#include <iostream>
using namespace std;
#define MILLION 10000
#define FOUR 4
#define TEN 10
#define HUNDRED 100
#define TWELVE 12
int MONTH[13] = {0, 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void IsLeapYear(int year) {		//判断输入的年份是不是闰年
    if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) 
        MONTH[2] = 29;
    else
        MONTH[2] = 28;
}
int fun(int year) {
    int ret = 0;
    for(int j = 0; j < FOUR; j++) {
        ret = year % TEN + ret * TEN;		//秦九韶计算多项式关键步骤
        year /= TEN;
    }
    return ret;
}
int main() {
    int date1, date2;
    cin >> date1 >> date2;
    int year1 = date1 / MILLION;
    int year2 = date2 / MILLION;
    int makeDate;
    int month, day;
    int count = 0;
    for(int i = year1; i <= year2; i++) {
        IsLeapYear(i);
        int monthDay = fun(i);
        makeDate = i * MILLION + monthDay;
        month = monthDay / HUNDRED;
        day = monthDay % HUNDRED;
        if(month <= TWELVE && day <= MONTH[month] && makeDate >= date1 && makeDate <= date2) 		//判断条件比较复杂
            count++;
    }
    cout << count << endl;
    return 0;
}

欢迎批评指正