标签:
假定输入的日期和天数合法正确。
这道题挺费力的,想了很久。我的想法是:按照年,月,日依次来减少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