此题需要考虑到两个地方
1. 是否为闰年
2. 加的天数会不会使得日期到明年或者以后某年
3. 当日期到某年时,过程中的是否为闰年的判断以及数值变化 主要是二月份天数和全年总天数
#include <bits/stdc++.h>
using namespace std;
#define N 1000
class Date
{
private:
int year=0;
int month=0;
int day=0;
int add = 0;
public:
void addDate();
Date(int a, int b, int c, int d);
Date();
};
Date::Date(int a, int b, int c, int d)
{
year = a;
month = b;
day = c;
add = d;
}
Date::Date()
{
int year=0;
int month=0;
int day=0;
int add=0;
}
void Date::addDate()
{
//先默认为非闰年
int dayarr[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int sum_date = 365;
//判断是否为闰年
if(year%400==0)
{
dayarr[2] = 29;
sum_date = 366;
}
else
{
if(year%4==0 && year%100!=0)
{
dayarr[2] = 29;
sum_date = 366;
}
}
int sum=0; //月中的日期累计
for(int i=1; i<=month-1; i++)
{
sum+=dayarr[i];
}
sum = sum+day+add;//实现加天数
//已经超过本年
while(sum>sum_date)
{
sum = sum-sum_date;
year++;
if(year%400==0)
{
dayarr[2] = 29;
sum_date = 366;
}
else if(year%4==0 && year%100!=0)
{
dayarr[2] = 29;
sum_date = 366;
}
else
{
dayarr[2] = 28;
sum_date = 365;
}
}
// 根据天数反向求日期
int sum_monthday = 0; //累计天数
int month_real = 0;//对应的月份
for(int i=1; i<=12; i++)
{
sum_monthday+=dayarr[i];
if(sum_monthday>=sum) //当累计天数大于实际天数 跳出
{
month_real = i;
break;
}
}
month = month_real;
//用sum减去当月之前的所有月份天数==当月的天数
//当月之前的所有天数=累计天数-本月天数
day = sum-(sum_monthday-dayarr[month]);
printf("%d-%02d-%02d\n", year, month, day);
}
int main()
{
int n = 0;
scanf("%d", &n);
for(int i=0; i<n; i++)
{
int a=0,b=0,c=0,d=0;
scanf("%d %d %d %d", &a, &b, &c, &d);
Date date=Date(a,b,c,d);
date.addDate();
}
return 0;
}