题目链接: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; }