Problem B: 英雄无敌3(2)【模拟,日期转换】

Problem B: 英雄无敌3(2)

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 295  Solved: 52
[Submit][Status][Web Board]

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 "); else printf("%d ",solve(year,mouth,day)); } return 0; }

  

 
原文地址:https://www.cnblogs.com/Roni-i/p/7373922.html