题目要求

设计一个程序,能够计算一个给定日期加上若干天后是什么日期。

输入格式

  • 第一行包含整数 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 }

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(" } return 0; }

分类: Thought

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注

友情链接:Ctips' blog, Colza’s blog

站点状态:Status