C语言 · 日期计算

算法提高 日期计算  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
  输入只有一行
  YYYY MM DD
输出格式
  输出只有一行
  W
数据规模和约定
  1599 <= YYYY <= 2999
  1 <= MM <= 12
  1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
  1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 /*判断闰年函数:四年一闰,百年不闰,四百年再闰.*/
 4 bool leap(int year){
 5     if(year%4==0 && year%100!=0)
 6         return true;
 7     if(year%400==0)
 8         return true;
 9     return false;
10 }
11 /*年份带来的天数差*/
12 getDay1(int year){
13     int sum=0;//记录年份带来的天数差
14     if(year<=2011){
15         for(int i=year;i<2011;i++){
16             if(leap(i))
17                 sum+=366;
18             else
19                 sum+=365;
20         }
21     }
22     if(year>2011){
23         for(int i=2011;i<year;i++){
24             if(leap(i))
25                 sum+=366;
26             else
27                 sum+=365;
28         }
29     }
30     return sum;
31 }
32 /*月份带来的天数差*/
33 int getDay2(int year,int mon,int day){
34     int sum=0;//记录月份带来的天数差
35     for(int i=1;i<mon;i++){
36         if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12){
37             sum+=31;
38         }
39         if(i==4 || i==6 || i==9 || i==11){
40             sum+=30;
41         }
42         if(i==2 && leap(year)){
43             sum+=29;
44         }
45         if(i==2 && !leap(year)){
46             sum+=28;
47         }
48     }
49     sum = sum + day;
50     return sum-1;//加到基准天数时其实多加了1 
51 }
52 /*
53 在得出天数之后,还要分情况,首先将得到的天数差day%7,得到星期差;
54 
55 (1)如果给出的年份小于等于基础年份,那么应该从基础时间(星期六)
56     向负方向数day%7天,注意1之后要变成7;
57     
58 (2)如果给出的年份大于基础年份,那么应该从基础时间(星期六)
59     向正方向数day%7天,注意7之后要变成1.
60     
61 注:abs():取绝对值函数。 
62 */
63 int main(){
64     int year,month,day;
65     scanf("%d%d%d",&year,&month,&day);
66     int sum=getDay1(year);//得到年份带来的天数差
67     if(year<2011){
68         sum = sum-getDay2(year,month,day);
69         int ans = sum%7;
70         printf("%d",ans==6?7:abs(6-ans));
71     }else{
72         sum = sum+getDay2(year,month,day);
73         int ans = sum%7;
74         printf("%d",(6+ans)>7 ? ((6+ans)%7) : (6+ans));
75     }
76     return 0;
77 }
原文地址:https://www.cnblogs.com/panweiwei/p/6646010.html