算法提高 日期计算
时间限制: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
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
int is_ok(int year)
{
if(year%4==0&&year%100!=0)
return 1;
if(year%400==0)
return 1;
else
return 0;
}
int getY(int year)
{
int sum=0;
if(year>2011)
{
for(int i=2011; i<year; i++)
{
if(is_ok(i))
sum+=366;
else
sum+=365;
}
}
else
{
for(int i=year; i<2011; i++)
if(is_ok(i))
sum+=366;
else
sum+=365;
}
return sum;
}
int getM(int yy,int mm,int dd)
{
int sum=0;
int i,j;
for(i=1; i<mm; i++)
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
sum+=31;
if(i==4||i==6||i==11||i==9)
sum+=30;
if(i==2&&is_ok(yy))
sum+=29;
if(i==2&&!is_ok(yy))
sum+=28;
}
sum=sum+dd-1;
return sum;
}
int main()
{
int yy,mm,dd;
int sum;
while(scanf("%d%d%d",&yy,&mm,&dd)!=EOF)
{
sum=getY(yy);
if(yy<2011)
{
sum-=getM(yy,mm,dd);
cout<<(sum%7==6?7:abs(6-(sum%7)))<<endl;
}
else
{
sum+=getM(yy,mm,dd);
cout<<((6+(sum%7))>7?((6+(sum%7))%7):(6+(sum%7)))<<endl;
}
}
return 0;
}