思路:先判断是否能逐年增
,再逐天增
要点:
1.由于2.29只有闰年有,先转换成3.1处理
2.设计一个函数,判断要跳转到下一年同日期,需要经过多少天
3.先逐年增再逐天增
,防止TLE
4.多条赋值语句可以利用逗号运算符写成一条
,代码更美观
示例:if(m==2&&d==29) a--,m=3,d=1;
代码:
#include<bits/stdc++.h>
using namespace std;
const int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int is_leap(int y)
{
if(y%4==0&&y%100||y%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)
{
//今年1.1~2.28跳到明年1.1~2.28时 要考虑今年是否为闰年(多跳一天2.29)
if(m<=2) return 365+is_leap(y);
//今年3.1~12.31跳到明年3.1~12.31时 要考虑明年是否为闰年(多跳一天2.29)
return 365+is_leap(y+1);
}
int main()
{
int T;
cin>>T;
while(T--)
{
int y,m,d,a;
cin>>y>>m>>d>>a;
//如果为2.29
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;
}