3573. 日期累加
设计一个程序能计算一个日期加上若干天后是什么日期。
输入格式 第一行包含整数 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
get_days() 特判二月份:若 闰年 d += month[2] + is_leap(y);
//s-- //1号也算1天
//背is_leap(y) 平年: return 0 , 闰年 :return 1
//get_days() 特判二月份:若 闰年 d += month[2] + is_leap(y);
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
//平年每月的天数
const int months[] = {
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
//判断是否是闰年
bool is_leap(int y)
{
if(y % 400 == 0 || (y % 100 && y % 4 == 0)) return true;
return false;
}
//获得y年第m月的天数
int get_days(int y, int m)
{
if(m == 2) return months[m] + is_leap(y);
return months[m];
}
//获得y年第m月--y + 1年第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;
}
标签:return,get,int,31,days,--,日期,数据结构,考研
From: https://blog.51cto.com/u_15623277/6890890