日期类问题有一个统一的思想:把原区间问题统一到起点确定的区间问题上去。当要求两个特定日期之间的天数差时,
只要将它们与原点日期的天数差相减,便能得到这两个特定日期之间的天数差(绝对值)
下面的代码时求两个日期之间的间隔,和某日是星期几
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 5 int IsLeap(int x); 6 int Sum( int y,int m,int d); 7 8 char weekname[7][20]={ 9 "Sunday", 10 "Monday", 11 "Tuesday", 12 "Wednesday", 13 "Thursday", 14 "Friday", 15 "Saturday" 16 }; 17 18 int main() 19 { 20 int y1,m1,d1,y2,m2,d2; 21 int s1,s2,s3; 22 23 scanf("%4d%2d%d",&y1,&m1,&d1); 24 scanf("%4d%2d%d",&y2,&m2,&d2); 25 s1 = Sum( y1,m1,d1); 26 s2 = Sum( y2,m2,d2); 27 s3 = Sum( 2018,02,07); 28 int days = s1-s3; 29 days += 3; //2018年2月7日是星期三 30 31 printf("%d",abs( s1-s2)); 32 puts(weekname[(days%7+7)%7]); //先求余在+7再求余是为了避免出现负数 33 34 return 0; 35 } 36 int IsLeap(int x) 37 { 38 //判断是否是闰年 39 return (x%100!=0 && x%4==0) || x%400==0 ? 1:0; 40 } 41 int Sum( int y,int m,int d) 42 { 43 //判断距离0年1月1日有多少天 44 int x[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31}; 45 int i,s=0; 46 for( i=0; i<y; i++){ 47 if( IsLeap(i)) s += 366; 48 else s += 365; 49 } 50 if( IsLeap(y)) x[2] = 29; 51 52 for( i=1; i<m; i++) s += x[i]; 53 54 s += d; 55 56 return s; 57 }