主要思路
关键在枚举对象,从头到尾遍历太莽了,故针对回文数关于中轴左右对称特点,为了降低复杂度,利用年份构造月份与天,再判断构造出的日期是否在左右端点之内
易错点
- 构造月份与天用了秦九韶计算多项式的方法
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;
}
欢迎批评指正