Description
英雄无敌3中的兽人觉得人类的星期制度很好,要模仿这个制度,但他们大多都很愚蠢,他们搞不明白人类的星期制度。虽然他们出了很多题目(给出日期,输出星期几),但不知道答案,作为兽人的人类朋友,你可以帮助他们吗?(为了表示方便,0代表星期天,1代表星期一,2代表星期二,3代表星期三,4代表星期四,5代表星期五,6代表星期六)
Input
第一行输入一个数t,代表题目数。
每个题目有3个正整数分别为年,月,日
Output
对于每组案例,输出一个整数,代表星期几(当然由于兽人很愚蠢,他们给出的日期有可能是不存在的,对于这种情况,请输出-1)
Sample Input
1
2013 4 25
Sample Output
4
基姆拉尔森公式
if(f(year,month,day))
{
if(month==1||month==2) //在计算一、二月时,特殊操作
{
month+=12; //月份加12月(相当于1年)
year--; //因为加了12月,所以年份相应的-1
}
int weekend= (day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7;
}
具体代码如下:
#include<cstdio>
int year;
int month;
int day;
bool f(int year,int month,int day)
{
int flag=0,dayss;
if((year%4==0&&year%100!=0)||year%400==0)
flag=1;
if(month>=1&&month<=12)
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
dayss=31;
break;
case 4:
case 6:
case 9:
case 11:
dayss=30;
break;
case 2:
if(flag)
{
dayss=29;
}
else
{
dayss=28;
}
break;
default:
break;
}
if(!(day>0&&day<=dayss))
{
return false;
}
}
else
{
return false;
}
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&year,&month,&day);
if(f(year,month,day))
{
if(month==1||month==2)
{
month+=12;
year--;
}
int weekend=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7;
printf("%d\n",weekend);
}
else
{
printf("-1\n");
}
}
return 0;
}