将问题简化为不断求解下一天的日期,则时间复杂度为O(N)
输入的N为正数表示求N天后的日期:day不断进行加1操作,若day>该月的最大天数,则月份加1,day从1开始计数;月份大于12时,年份加1
输入的N为负数表示求N天前的日期:day不断进行减1操作,若day<1,则月份减1,day=前一个月的最大天数;月份小于1时,年份减1
<pre class="cpp" name="code">#include<cstdio>
#include<cstdlib>
#include<cmath>
int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};//每个月的天数
class Date
{
public:
int year;
int month;
int day;
void Input()
{
scanf("%d",&year);
scanf("%d",&month);
scanf("%d",&day);
}
void Print()
{
printf("%d",year);
printf("/%d",month);
printf("/%d",day);
}
};
bool IsLeap(int year)//判断是否为闰年
{
return (year%4==0&&year%100!=0)||year%400==0;
}
int DayInYear(int year,int month,int day)
{
if(IsLeap(year))
DAY[1]=29;
for(int i=0;i<month-1;i++)
day+=DAY[i];
return day;
}
Date date;
int main()
{
date.Input();
if(date.month>12||date.month<=0||date.day<=0||date.day>DAY[date.month-1])
printf("日期输入有误,请重新输入");
int input_day;//输入的天数
scanf("%d",&input_day);
if(IsLeap(date.year))
DAY[1]=29;
if(input_day<0)//求N天前的日期
{
for(int i=0;i<abs(input_day);i++)
{
if(input_day<0)
{
date.day--;
if(date.day<1)
{
//printf("%d\n",date.day);
date.month--;
if(date.month<1)
{
date.year--;
date.month=12;
}
//printf("newmonth=%d\n",date.month);
date.day=DAY[date.month-1];
}
}
}
}
else//求N天后的日期
{
for(int i=0;i<input_day;i++)
{
date.day++;
if(date.day>DAY[date.month-1])
{
//printf("%d\n",date.day);
date.month++;
date.day=1;
}
if(date.month>12)
{
date.year++;
date.month=1;
}
}
}
date.Print();
return 0;
}