算法提高 日期计算

http://lx.lanqiao.org/problem.page?gpid=T265

算法提高 日期计算  
时间限制: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
 
分析:
以某一个点为参照,向前或者向后计算,注意闰年2月的计算。
 
AC代码:
 
 1 #include<iostream>

 2 #include <stdio.h>

 3 #include<cmath>

 4 using namespace std;

 5 

 6 bool leap(int year)

 7 {

 8     if(year%4==0&&year%100!=0)

 9     return true;

10     if(year%400==0)

11     return true;

12     return false;

13 } 

14 

15 int getYD(int year)

16 {

17     int sum=0;

18     int i;

19     if(year<=2011)

20     {

21         for(i=year;i<2011;i++)

22         {

23             if(leap(i))

24             sum+=366;

25             else

26             sum+=365;    

27         }

28     }

29     if(year>2011)

30     {

31         for(i=2011;i<year;i++)

32         {

33             if(leap(i))

34             sum+=366;

35             else

36             sum+=365;

37         }

38     }

39     return sum;

40 }

41 

42 int getMD(int year,int mon,int day)

43 {

44     int i;

45     int sum=0;

46     for(i=1;i<mon;i++)

47     {

48         if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)

49         sum+=31;

50         if(i==4||i==6||i==9||i==11)

51         sum+=30;

52         if(i==2&&leap(year))

53         sum+=29;

54         if(i==2&&!leap(year))

55         sum+=28;

56     }

57     sum=sum+day-1;

58     return sum;

59 }

60 

61 

62 

63 int main()

64 {

65     //freopen("1.in ", "r" , stdin);

66     //freopen("1.out" , "w" , stdout);

67 

68     int year,mon,day,sum;

69     while(cin>>year>>mon>>day)

70     {

71         sum=getYD(year);

72         //cout<<getMD(year,mon,day)<<endl;;

73         if(year<2011)

74         {

75             sum=sum-getMD(year,mon,day);

76             //cout<<sum<<endl;

77             cout<<(sum%7==6?7:abs(6-(sum%7)))<<endl;

78         }

79         else

80         {

81             sum=sum+getMD(year,mon,day);

82             //cout<<sum<<endl;

83             cout<<((6+(sum%7))>7?((6+(sum%7))%7):(6+(sum%7)))<<endl;

84         }

85         

86         

87     }

88     return 0;

89 }
View Code

 

你可能感兴趣的:(算法)