模拟:日期处理

10 分钟

日期题的核心是两样知识:闰年判断和每月天数。闰年规则是"四年一闰、百年不闰、四百年再闰":

bool leap(int y) {
    return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0;
}
int mon[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int mdays(int y, int m) {
    if (m == 2 && leap(y)) return 29;
    return mon[m];
}

算"某天是星期几"或"两个日期差几天",最稳的办法是从一个固定起点一天天往前推、累加天数,别去套复杂公式:

long long total = 0;
for (int y = 1; y < Y; y++) total += leap(y) ? 366 : 365;
for (int m = 1; m < M; m++) total += mdays(Y, m);
total += D;

常见坑:闰年判断漏了 400 那条;2 月默认写成 28 天忘了闰年补 29;下标从 0 还是 1 开始要统一。复杂度 ,数据再大用天数累加也够快。

小纸条

2024 年 2 月有几天?

登录 后可看答案

模拟:日期处理 · 考级冲刺 · op599 课程