文章目录
- 日期累加
- 日期类问题必备函数
- AC代码
日期累加
本题链接:日期累加
本博客给出本题截图:
日期类问题必备函数
const int months[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int is_leap(int year) // 闰年返回1,平年返回0 { if (year % 4 == 0 && year % 100 || year % 400 == 0) return 1; return 0; } int get_days(int y, int m) // y年m月有多少天 { if (m == 2) return months[m] + is_leap(y); return months[m]; }
AC代码
代码解释:打印日期(华中科技大学考研机试)的基础上加上一点小优化即可:先一年一年的去数,如果不够一年的天数再一天一天的去数。这里跳过一整年的操作细节处理如下:如果这一天是2月29,因为明天必不可能有2月29,故我们可以让总天数减一,然后让日期变为3月1,如果这一天在1月1日 ~ 2月28日之间,我们需要判断当年是否为闰年(看是否会跳过2月29这一天),如果这一天在3月1日 ~ 12月31日,我们需要判断明年是否为闰年(看是否会跳过2月29这一天)
代码:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int months[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int is_leap(int year) { if (year % 4 == 0 && year % 100 || year % 400 == 0) return 1; return 0; } int get_days(int y, int m) { if (m == 2) return months[m] + is_leap(y); return months[m]; } int get_year_days(int y, int m) { if (m <= 2) return 365 + is_leap(y); return 365 + is_leap(y + 1); } int main() { int T; cin >> T; while (T -- ) { int y, m, d, a; cin >> y >> m >> d >> a; if (m == 2 && d == 29) a --, m = 3, d = 1; while (a > get_year_days(y, m)) { a -= get_year_days(y, m); y ++ ; } while (a -- ) { if ( ++ d > get_days(y, m)) { d = 1; if ( ++ m > 12) { m = 1; y ++ ; } } } printf("%04d-%02d-%02d\n", y, m, d); } return 0; }