Loading... ### 题目要求 设计一个程序,能够计算一个给定日期加上若干天后是什么日期。 ### 输入格式 * 第一行包含整数 T,表示共有 T 组测试数据。 * 每组数据占一行,包含四个整数 y, m, d, a,分别表示给定日期的年、月、日和累加的天数。 ### 输出格式 每组数据输出一行,一个结果,每行按 yyyy-mm-dd 的格式输出。 ### 数据范围 * 1 ≤ T ≤ 1000 * 1000 ≤ y ≤ 3000 * 1 ≤ m ≤ 12 * 1 ≤ d ≤ 31 * 1 ≤ a ≤ 10^6 * 保证输入日期合法。 ### 示例输入: ``` 1 2008 2 3 100 ``` ### 示例输出: ``` 2008-05-13 ``` ### 提示 * 可以使用常规的日期计算方法来解决这个问题,例如,从给定日期开始,依次累加每一天,直到累加的天数达到 a。 * 注意要处理每个月的天数不一样,闰年的情况,以及进位进到下一个月和年的情况。 ### 题目分析 * 通过按枚举年份来显著降低时间复杂度。 * 注意润年的处理。 ### 代码实现 ``` #include <iostream> using namespace std; const int N = 13; ``` int days[N] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; inline bool isLeap(const int& y) { return (y % 4 == 0 && (y % 100 || !(y % 400))); } inline int getDay(const int& y, const int& m) { return days[m] + (m == 2 && isLeap(y)); } inline int getYear(const int& y, const int& m) { if (m < 3) return 365 + isLeap(y); else return 365 + isLeap(y + 1); } int y, m, d, T, t; int main () { ios::sync\_with\_stdio(0); cin.tie(0); cin >> T; while(T--) { cin >> y >> m >> d >> t; if (m == 2 && d == 29) --t, ++m, d = 1; while(t > getYear(y,m)) t -= getYear(y++,m); while(t--) { ++d; if (d > getDay(y,m)) { d = 1; ++m; } if (m > 12) { m = 1; ++y; } } printf("%04d-%02d-%02d\\n",y,m,d); } return 0; } 最后修改:2023 年 09 月 23 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏