算法1
思路:
这个题感觉处理起来还是有点麻烦的,日期累加的时候需要注意,如果 这一年是闰年,那么他的2月份就有29天,他的下一年是28天,如果今年2月是28天,就需要判断明年是否是闰年,在这里加入了一个新的函数,我感觉不熟悉的最好能记一下啊,不然让自己想,可能有点费时间,具体的代码,下面解释很详细
C++ 代码
#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)//处理2月
{
if(m==2)return months[m]+is_leap(y);
return months[m];
}
//这个题需要注意的一点是,如果今年是闰年,也就是2月有29天,那么明年就是平年,2月是28天
//如果今年是平年,需要判断明年是否是闰年
int get_year_day(int y,int m)
{
if(m<=2)return 365+is_leap(y);//如果月份小于2,判断今年是否是闰年
return 365+is_leap(y+1);//如果月份在3-12月,那么判断明年是否是闰年
}
int main()
{
int n;
cin>>n;
int y,m,d,a;
while(n--)
{
cin>>y>>m>>d>>a;
if(m==2 &&d==29) a--,m=3,d=1;//在这里预先对闰年2月做了处理,就是增加的天数首先减一,然后天///数变到3月1日继续算
while(a>get_year_day(y,m))//这块处理年
{
a-=get_year_day(y,m);
y++;
}
while(a--)//这块处理月和日,详细的可以看我之前3607的具体解析,这个题是那个题的升级版
{
if(++d>get_days(y,m))
{
d=1;
if(++m>12)
{
m=1;
y++;
}
}
}
printf("%04d-%02d-%02d\n",y,m,d);
}
return 0;
}