您的位置:首页 > 其它

蓝桥杯 日期计算

2016-01-22 23:27 405 查看
算法提高 日期计算  

时间限制: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

哎哎,只有80分,总有一组测试数据没过,觉得有时候蓝桥杯的测评系统也挺坑的。这次不是VIP也无法查看到底是哪个坑爹的数据没过。思路还是可以的。

#include<stdio.h>
int days[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int days2[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
int main()
{
int y,m,d;
while(~scanf("%d%d%d",&y,&m,&d))
{
if(y<1599||y>2999||m<1||m>12||d<1||d>31)
continue;
int flag=0;
if(y<=2011)
{
if(y==2011)
{
if(m<=11)
{
if(m==11)
{
if(d<=11)
flag=1;
}
else
flag=1;
}
}
else
flag=1;
}
int sum=0,dd;
if(flag)
{
for(int i=1; i<11; i++)
sum+=days[i];
sum+=11;
for(int i=2010; i>=y; i--)
{
if(i%4==0||i%400==0&&i%100!=0)
sum+=366;
else
sum+=365;
}
if(y%4==0||y%400==0&&y%100!=0)
{
for(int i=1; i<m; i++)
sum-=days2[i];
sum-=d;
}
else
{
for(int i=1; i<m; i++)
sum-=days[i];
sum-=d;
}
dd=sum%7;
if(dd==5)
printf("6\n");
else if(dd==6)
printf("7\n");
else
printf("%d\n",5-sum%7);
}
else
{
if(y==2011)
{
for(int i=11; i<m; i++)
sum+=days[i];
sum+=d;
dd=sum%7;
if(dd<=2)
printf("%d\n",5+dd);
else
printf("%d\n",dd-2);
}
else
{
sum=19+31;
for(int i=2012; i<y; i++)
{
if(i%4==0||i%400==0&&i%100!=0)
sum+=366;
else
sum+=365;
}
if(y%4==0&&y%100!=0||y%400==0)
{
for(int i=1; i<m; i++)
sum+=days2[i];
sum+=d;
}
else
{
for(int i=1; i<m; i++)
sum+=days[i];
sum+=d;
}
dd=sum%7;
if(dd<=2)
printf("%d\n",5+dd);
else
printf("%d\n",dd-2);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  蓝桥杯 算法提高