算法提高 日期计算
时间限制: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
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 }