算法提高 日期计算
时间限制: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
//代码:
#include<stdio.h>
int f[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31};
int is_leapyear(int Y){
if(Y%4==0&&Y%100!=0||Y%400==0)
return 1;
return 0;
}
int DAY(int Y,int M,int D){
int i,days=0;
for(i=1;i<M;++i){
days+=f[i];
}
days+=D;
if(is_leapyear(Y)&&M>2)
days++;
return days;
}
int main(){
int year,month,day;
while(~scanf("%d%d%d",&year,&month,&day)){
int dd=0,xq;
if(year>2011||year==2011&&month>11||year==2011&&month==11&&day>=11) {
for(int i=2011;i<year;++i){
dd+=365;
if(is_leapyear(i))
dd++;
}
dd+=DAY(year,month,day);
dd-=DAY(2011,11,11); //?????
xq=(5+dd)%7; //星期
}
else
{ //已2012 1 1 为 标准量值
for(int i=year+1;i<=2011;++i){
dd+=365;
if(is_leapyear(i))
dd++;
}
dd-=365-DAY(2011,11,11);
dd+=365-DAY(year,month,day);
if(is_leapyear(year))
dd++;
//printf("%d\n",dd);
//printf("星期:%d\n",(5-(dd)%7+7)%7) ;
xq=(5-dd%7+7)%7;
}
if(xq==0)
printf("7\n");
else
printf("%d\n",xq);
}
return 0;
}