日期类问题

日期类问题有一个统一的思想:把原区间问题统一到起点确定的区间问题上去。当要求两个特定日期之间的天数差时,

                                                      只要将它们与原点日期的天数差相减,便能得到这两个特定日期之间的天数差(绝对值)

下面的代码时求两个日期之间的间隔,和某日是星期几

 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 }

 

posted @ 2018-02-07 19:47  yuxiaoba  阅读(174)  评论(0编辑  收藏  举报