日期模拟 O(n)
日期枚举
for (int i = 1000; i <= 9999; ++ i)
{
int date = 1, temp = i; // 枚举的回文日期和临时变量存储
while (t)
{
date = date * 10 + t % 10; // 每次循环从t的个位取出拼接到date
t /= 10; // t取出个位后的数值
}
if (check(date)) ++ cnt; // 如果枚举的date满足条件, 方案数加1
}
日期检查
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(int date)
{
if (date > date1 || date < date2) // date首先必须在date1和date2之间
return false;
int year = date / 10000; // 取前4位作为年份
int month = date % 10000 / 100; // 取后4位, 再取后4位中的前2位作为月份
int day = date % 100; // 取后两位,作为日
if (!month || month > 12 || !day) // 月和日是正数
return false;
if (month != 2 && day > days[month]) // 月份不是二月
return false;
if (month == 2) // 月份是二月, 特判闰年
{
int leap = year % 4 == 0 && year % 100 || year % 400 == 0;
if (day > 28 + leap) return false;// 预处理是否为闰年
}
return true;
}