JD_1043(Day of Week)

题目链接:http://ac.jobdu.com/problem.php?pid=1043


这是一道日期题目,跟我上篇文章一样,日期题目关键是打表,找到基准点0年1月1日,然后打表记录其它点到这个基准点的距离,然后根据你已经知道的其它日期的信息来推算结果!如我知道2016年4月30日是星期6,因为这篇文章就是4月30日写的,那么我打表能够得到2016年4月30日到0年1月1日的相隔多少天,那么我输入的日期我能够计算与0年1月1日相隔的天数,俩个一做差,要求的信息就出来了!!


ac代码如下:

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <vector>
#include <cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn = 5555;
int day[maxn][13][32];
int month[13][2]                       //第二个代表闰年
{
	0,0,
	31,31,
	28,29,
	31,31,
	30,30,
	31,31,
	30,30,
	31,31,
	31,31,
	30,30,
	31,31,
	30,30,
	31,31,                               //这是第12行,切记
}; //有瑞年与非瑞年之分
map<string, int>M;							  //用map来对应
map<int, string>M_week;
void Init()										//用map和数组都是可以的
{
	M["January"] = 1;
	M["February"] = 2;
	M["March"] = 3;
	M["April"] = 4;
	M["May"] = 5;
	M["June"] = 6;
	M["July"] = 7;
	M["August"] = 8;
	M["September"] = 9;
	M["October"] = 10;
	M["November"] = 11;
	M["December"] = 12;
	M_week[0] = "Sunday";
	M_week[1] = "Monday";
	M_week[2] = "Tuesday";
	M_week[3] = "Wednesday";
	M_week[4] = "Thursday";
	M_week[5] = "Friday";
	M_week[6] = "Saturday";

}
bool isleap(int n)
{
	if (n % 4 == 0 && n % 100 != 0 || ((n % 400) == 0))
		return true;
	else
		return false;
}
void make_table()
{
	int cnt = 1;
	int year = 0, month1 = 1, day1 = 1;
	while (year<5000)
	{
		day[year][month1][day1] = cnt;
		cnt++;
		day1++;
		if (day1 > month[month1][isleap(year)])
		{
			day1 = 1;
			month1++;
			if (month1>12)
			{
				month1 = 1;
				year++;	
			}
		}
	}
}
int main(void)
{
	//freopen("in.txt", "r", stdin);                  //日期的题目,打表解决
	Init();
	make_table();
	int dayy, yearr;
	string monthh;

	while (cin >> dayy >> monthh >> yearr)
	{
		int diff;
		diff = -day[2016][4][30]+day[yearr][M[monthh]][dayy];
		cout << M_week[((diff+6) % 7 + 7) % 7] << endl;                //防止有负数,从星期6为基准
	}
	return 0;
}

你可能感兴趣的:(日期类问题)