优化写法:因为按题目来写的话,时间复杂度过高,所以直接从年到月再到日来优化
#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)
{
if(m == 2) return months[m] + is_leap(y);
return months[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)) //判断天数是否加够到对应月份,够了就回1,然后m要前加加,不够就继续
{
d = 1;
if( ++ m > 12) //判断前加加后的月份是否加满12个月,够的话就加年
{
m = 1;
y ++;
}
}
}
printf("%04d-%02d-%02d\n",y,m,d);
}
return 0;
}