思路
假设起始日期是当月1日
1. N小于当月天数,则年份月份 不变,天数直接加上N,程序结束。
2. 若N大于等于当月天数,且当前月份为12月,年份加1,月份重置为1,否则,年份不变,月份加1。
3. 以更新后的日期和剩余的天数为输入,重复步骤1,2.
#include <stdio.h>
struct Date {
int year;
int month;
int day;
};
/***
*返回值 日期
*date 起始日期
*N
***/
Date& whichDate(Date& date, int days){
//将起始日期转化为当前月份的第一天
days += (date.day -1);
date.day = 1;
//计算当前月份天数
int day = 0;
switch(date.month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
if((date.year % 4 == 0 && date.year % 100 !=0) || date.year % 400 == 0){
day = 29;
}
else {
day = 28;
}
break;
}
//更新日期和总天数
if (days - day >= 0)
{
if (date.month == 12)
{
date.year += 1;
date.month = 1;
}
else{
date.month += 1;
}
return whichDate(date,days-day);//递归
}
else {
date.day += days;
}
return date;
}
void main()
{
Date date;
date.year = 2016;
date.month = 4;
date.day = 18;
int days = 10000;
date = whichDate(date,days);
printf("%4d-%02d-%02d",date.year,date.month,date.day);
}