算法提高 日期计算
时间限制: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
解题思路
计算出给定日期与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;
}