日期模拟

日期模拟 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;
}
posted @ 2022-05-03 17:22  feiyucoder  阅读(41)  评论(0)    收藏  举报