<center>
Submit: 295 Solved: 52
[ Submit][ Status][ Web Board] </center>
Problem B: 英雄无敌3(2)
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 295 Solved: 52
[ Submit][ Status][ Web Board] </center>
Description
英雄无敌3中的兽人觉得人类的星期制度很好,要模仿这个制度,但他们大多都很愚蠢,他们搞不明白人类的星期制度。虽然他们出了很多题目(给出日期,输出星期几),但不知道答案,作为兽人的人类朋友,你可以帮助他们吗?(为了表示方便,0代表星期天,1代表星期一,2代表星期二,3代表星期三,4代表星期四,5代表星期五,6代表星期六)
Input
第一行输入一个数t,代表题目数。
每个题目有3个正整数分别为y(0<y<=2013), m(0=<m<=20), d(0<=d<=40)分别代表年,月,日。
Output
对于每组案例,输出一个整数,代表星期几(当然由于兽人很愚蠢,他们给出的日期有可能是不存在的,对于这种情况,请输出-1)
Sample Input
1 2013 4 25
Sample Output
4
【分析】:已知年月日求星期几有专门的公式,要注意的点是 闰平年的二月天数不同,月份可以用常量数组表示。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 1000000000;
const int maxn = 100;
int T,n,m;
int year,mouth,day;
int solve(int yy,int mm,int dd)
{
int m[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
if(mm==0||mm>12||dd==0||dd>31)
{
return -1;
}
if(!((yy%4==0&&yy%100!=0)||yy%400==0))
m[2]=28;
else
m[2]=29;
if(dd>m[mouth])
{
return -1;
}
if(mm<3)//在普适公式/基姆拉尔公式中有个与其他公式不同的地方:
//把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
{
yy--;
mm+=12;
}
int c=yy/100;
int y=yy%100;
return (((c/4-2*c+y+y/4+13*(mm+1)/5+dd-1)%7+7)%7);
}
int main()
{
scanf("%d",&T);
int ans;
while(T--)
{
scanf("%d %d %d",&year,&mouth,&day);
if(year<=0||mouth<=0||day<=0||mouth>12||day>31)
printf("-1\n");
else
printf("%d\n",solve(year,mouth,day));
}
return 0;
}

京公网安备 11010502036488号