给定一个日期Day和一个正整数n,求日期Day加上n天后的日期。
输入格式为:
第一行:YYYY-MM-DD,范围为1900-01-01到2199-12-31。
第二行:n,表示要加的天数,范围为1到10000。
难点主要在处理闰年和不同月份不同日期上,仔细一点其实也不难。(当然,是说实现不难,代码要优雅那对现在的我来说还有点困难)
#include<iostream>
/*
题目:给定一个日期Day和一个正整数n,求日期Day加上n天后的日期。
输入格式为:
第一行:YYYY-MM-DD,范围为1900-01-01到2199-12-31。
第二行:n,表示要加的天数,范围为1到10000。
*/
// 该函数判断某一年是否为闰年
bool isLeapYear(int year)
{
return year%400==0||year%4==0&&year%100!=0;
}
const int leapYear[13]={0,31,60,91,121,152,182,213,244,274,305,335,366};
const int nonLeapYear[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};
int main()
{
int year, month, day;
int n;
std::scanf("%d-%d-%d", &year, &month, &day);
std::scanf("%d", &n);
// 将输入日期的月和日加到n中一起处理
if(isLeapYear(year))
n+=leapYear[month-1]+day;
else
n+=nonLeapYear[month-1]+day;
// 先忽略闰年计算增加的年份
int add_year = n/365;
int leapYearCount=0;
// 统计增加的年份之间闰年的总数
for(int i=year;i<year+add_year;i++)
{
if(isLeapYear(i))
leapYearCount++;
}
// 修正闰年的误差值,此处add_mday修正后可能为负数,需要额外处理
int add_mday = n%365 - leapYearCount;
if(add_mday<0)
{
if(isLeapYear(year+add_year-1))
add_mday+=366;
else
add_mday+=365;
add_year--;
}
// 计算增加的月份和日期
int add_month;
int add_day;
if(isLeapYear(year+add_year))
{
for(int j=0;j<13;j++)
{
if(add_mday<=leapYear[j])
{
add_month = j;
add_day = add_mday-leapYear[j-1];
break;
}
}
}
else
{
for(int j=0;j<13;j++)
{
if(add_mday<=nonLeapYear[j])
{
add_month = j;
add_day = add_mday-nonLeapYear[j-1];
break;
}
}
}
year+=add_year;
month=add_month;
day=add_day;
printf("%d-%02d-%02d", year, month, day);
return 0;
}