算法提高 日期计算
时间限制: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
解题思路
计算出给定日期与2011.11.11的差值,然后对7取余,与周五相比较运算,给出答案。
注意2011.11.11前和后的日期计算星期的时候不一样。
计算日期差值的时候,可以先计算年之间的差值,然后在计算两边月份的差值,最后再弄日的。
代码
#include<stdio.h> int leap(int a) { if(a%400==0||(a%4==0&&a%100!=0)) return 366; else return 365; } int day(int a,int b) { if(b==1||b==3||b==5||b==7||b==8||b==10||b==12) return 31; else if(b==4||b==6||b==9||b==11) return 30; else { if(leap(a)==366) return 29; else return 28; } } int nian(int a) { int i; int sum=0; if(a==2011) { return sum; } else if(a<2011) { for(i=a+1;i<2011;i++) sum+=leap(i); return sum; } else if(a>2011) { for(i=2012;i<a;i++) sum+=leap(i); return sum; } } int yue(int a,int b,int c,int d) { int i,j; int sum=0; for(i=b+1;i<13;i++) sum+=day(a,i); for(i=1;i<d;i++) sum+=day(c,i); return sum; } int answer(int a) { if(a==5) return 5; else if(a==6||a==-1) return 6; else if(a==7||a==0) return 7; else if(a==8||a==1) return 1; else if(a==9||a==2) return 2; else if(a==10||a==3) return 3; else if(a==11||a==4) return 4; } int main() { int a,b,c; int sum; int chaa,chab,chac; int i,j,k; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { sum=0; sum+=nian(a); if(a<2011) { sum+=yue(a,b,2011,11); sum+=(day(a,b)-c+11); } else if(a>2011) { sum+=yue(2011,11,a,b); sum+=(day(2011,11)-11+c); } else { sum+=yue(2011,12,2011,11); sum+=11; } sum%=7; if(a>2011) sum+=5; else if(a<2011) sum=5-sum; else { if(b<11) sum=5-sum; else if(b>11) sum+=5; else { if(c>11) sum+=5; else if(c<11) sum=5-sum; else sum=5; } } printf("%d\n",answer(sum)); } return 0; }
时间: 2024-10-23 12:16:29