码迷,mamicode.com
首页 > 其他好文 > 详细

输入 一个日期 和一个整数 n,输出从该日期起经过n天以后的日期

时间:2015-03-10 00:03:34      阅读:588      评论:0      收藏:0      [点我收藏+]

标签:

假定输入的日期和天数合法正确。

这道题挺费力的,想了很久。我的想法是:按照年,月,日依次来减少n的数量,直到得出结果。假定输入的日期为2013年5月3日,n为722天。

首先先判断n能不能让2013年跑完,如果能,则n = n - 2013年剩下的天数 - 1。则日期到了2014年1月1日,然后再判断剩下的n能不能让2014年跑完(注意是否闰年的问题)。直到n不足够让某年跑完,然后再让某年一个月一个月的跑,最后到不足跑完一个月,最后直接用当前的日期加上剩下的天数即可。

整个程序写下来要注意各种边界情况,还是比较费脑力的,一不留神就会出错。

  1 #ifndef __FUN_H__
  2 
  3 #define __FUN_H__
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 
  7 void cal_date(unsigned *, unsigned *, unsigned *, int);
  8 int is_leap_year(unsigned y);
  9 unsigned days_in_year(unsigned y, unsigned m, unsigned d);
 10 void swap(unsigned *m, unsigned *n);
 11 int days(unsigned y1, unsigned m1, unsigned d1);
 12 
 13 #endif
 14 
 15 //给定一个日期和一个整数n,求该日期n天之后的日期。
 16 
 17 int main(int argc, char *argv[])
 18 {
 19     unsigned y, m, d;
 20     unsigned months[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 21     int n;
 22 
 23     scanf("%d%d%d%d", &y, &m, &d, &n);
 24     printf("%d年%d月%d日之后%d天的日期为: ", y, m, d, n);
 25     cal_date(&y, &m, &d, n);
 26     printf("%d年%d月%d日\n", y, m, d);
 27     system("pause");
 28     return 0;
 29 }
 30 
 31 
 32 void cal_date(unsigned *y, unsigned *m, unsigned *d, int n)
 33 {
 34     int i;
 35     unsigned months[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 36 
 37     //i用来存储该年还剩多少天
 38     if (is_leap_year(*y))
 39         i = 366;
 40     else 
 41         i = 365;
 42     i -= days_in_year(*y, *m, *d);
 43     if (n >= (i + 1))
 44     {
 45         (*y)++;a
 46         (*m) = 1;
 47         (*d) = 1;
 48         n -= (i + 1);
 49     }
 50     i = 0;   //i监视下面的while循环跑了几次
 51     while ( n >= 365)
 52     {
 53         if(is_leap_year(*y) && n == 365) 
 54         {
 55             *m = 12;
 56             *d = 30;
 57             return ;
 58         }
 59         else if(is_leap_year(*y))
 60             n -= 366;
 61         else 
 62             n -=365;
 63         i++;
 64     }
 65     (*y) += i;
 66     if (n == 0) 
 67     {
 68         return;
 69     }
 70 
 71     if (is_leap_year(*y))
 72         months[2] = 29;
 73     i = months[*m] - *d; //i用来存储该月还有多少天
 74     if (n == i)
 75     {
 76         *d = *m;
 77         return;
 78     }
 79     else if (n < i)
 80     {
 81         *d += n;
 82         return;
 83     }
 84     else 
 85     {
 86         (*m)++;
 87         if( *m == 13) 
 88         {
 89             *m = 1;
 90             *y += 1;
 91         }
 92         *d = 1;
 93         n -= (i+1);
 94     }
 95     if (is_leap_year(*y))
 96         months[2] = 29;
 97     while(n >= months[*m])
 98     {
 99         n -= months[*m];
100         (*m)++;
101         if( *m == 13) 
102         {
103             *m = 1;
104             (*y) += 1;
105             if (is_leap_year(*y))
106                 months[2] = 29;
107         }
108     }
109 
110     *d += n;
111 }
112 
113 
114 unsigned days_in_year(unsigned y, unsigned m, unsigned d)
115 {
116     unsigned n = 0, i;
117     unsigned months[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
118 
119     if(is_leap_year(y))
120         months[2] = 29;
121     else 
122         months[2] = 28;
123     for ( i = 1; i < m; i++)
124         n += months[i];
125     n += d;
126     return n;
127 }
128 
129 int is_leap_year(unsigned y)
130 {
131     if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
132         return 1;
133     else 
134         return 0;
135 }

 

输入 一个日期 和一个整数 n,输出从该日期起经过n天以后的日期

标签:

原文地址:http://www.cnblogs.com/RookieSuperman/p/4324802.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!