給定一個日期,求N天后(前)的日期
阿新 • • 發佈:2019-01-09
將問題簡化為不斷求解下一天的日期,則時間複雜度為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; }