假定输入日期合法,且第二个日期晚于第一个日期。
我的想法是首先判断是不是同一年,如果是,则用第二个日期在当年的天数减去第一个日期在当年的天数即可;
如果不是,刚把中间间隔的天数分成三部分,第一部分为第一个日期到当年末的天数,第二部分为第一个日期的第二年第一天到第二个日期的前一年最后一天的天数,第三个部分为第二个日期的当年第一天到第二个日期的天数。三个部分相当即得相差天数。
特别要注意的是闰年一定要记得判断。
1 #ifndef __FUN_H__ 2 #define __FUN_H__ 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 unsigned days_in_year(unsigned y, unsigned m, unsigned d); 7 int is_leap_year(unsigned y); 8 #endif 9 10 //给定两个日期,求这两个日期相隔多少天? 11 #include "func.h" 12 13 int main(int argc, char *argv[]) 14 { 15 unsigned y1, m1, d1, y2, m2, d2, i, n = 0; 16 int res; 17 18 while (fflush(stdin), (res = scanf("%d%d%d%d%d%d", &y1, &m1, &d1, &y2, &m2, &d2)) != EOF) 19 { 20 n = 0; 21 if (y1 != y2) 22 { 23 if (is_leap_year(y1)) 24 n += 366 - days_in_year(y1, m1, d1); 25 else 26 n += 365 - days_in_year(y1, m1, d1); 27 for ( i = y1 + 1; i < y2; i++) 28 { 29 if( is_leap_year(i) ) 30 n += 366; 31 else 32 n += 365; 33 } 34 n += days_in_year(y2, m2, d2); 35 } 36 else 37 n = days_in_year(y2, m2, d2) - days_in_year(y1, m1, d1); 38 printf("以上两个日期相隔%d天\n", n); 39 } 40 system("pause"); 41 return 0; 42 } 43 44 45 unsigned days_in_year(unsigned y, unsigned m, unsigned d) 46 { 47 unsigned n = 0, i; 48 unsigned months[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 49 50 if(is_leap_year(y)) 51 months[2] = 29; 52 else 53 months[2] = 28; 54 for ( i = 1; i < m; i++) 55 n += months[i]; 56 n += d; 57 return n; 58 } 59 60 61 int is_leap_year(unsigned y) 62 { 63 if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) 64 return 1; 65 else 66 return 0; 67 }
PS:昭哥的方法相对较简单,特此记录。
假设输入日期为1988 5 1 2015 3 9
可直接计算1988年1月1日到2015年1月1日的天数。然后减去1988年5月1日在1988年的天数,再加上2015年3月9号在2015年的天数。
免去了对输入的两个日期是不是同一年的判断。
时间: 2024-10-13 16:24:16