算法提高 日期计算
http://lx.lanqiao.org/problem.page?gpid=T265
算法提高 日期计算
时间限制:1.0s 内存限制:256.0MB
问题描述
已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
输入只有一行
YYYY MM DD
YYYY MM DD
输出格式
输出只有一行
W
W
数据规模和约定
1599 <= YYYY <= 2999
1 <= MM <= 12
1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
1 <= W <= 7,分别代表周一到周日
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 }
悠游天地间 all rights reserved. © 2013 -- 1 << 64