题目描述(上交考研机试题)
已知 1 年 1 月 1 日是星期一。
现在给定一个日期,请你判断是星期几。
注意闰年的 2 月有 29 天。
满足下面条件之一的是闰年:
- 年份是 4 的整数倍,而且不是 100 的整数倍;
- 年份是 400 的整数倍。
样例
输入样例
9 October 2001
14 October 2001
输出样例
Tuesday
Sunday
数据范围
1000 ≤ y ≤ 3000 ,
给定日期保证合法。
每个输入最多包含 100 组数据。
解题思路
对每次查询 $O(1)$
- 直接构建一个换算公式, 对每一个输入直接换算得到然后输出;
- 对每个月, 存一个前缀和; 如果是闰年, 如果大于二月则+1;
- 对一共多少年, 计算出所有的闰年数, 然后加上总年数的365倍;
- 最后别忘减一;
#include<iostream>
#include<unordered_map>
using namespace std;
string week[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
unordered_map<string, int> month = {{"January", 0}, {"February", 31}, {"March", 59}, {"April", 90}, {"May", 120}, {"June", 151}, {"July", 181}, {"August", 212}, {"September", 243}, {"October", 273}, {"November", 304}, {"December", 334}};
void weekday(int dd, int mm, int yy){
int ans = yy/4 + yy/400 - yy/100 + yy*365 + mm + dd - 1;
cout<<week[ans%7]<<endl;
}
int main()
{
ios::sync_with_stdio(false);
int dd, yy;
string mm;
while(cin>>dd>>mm>>yy){
int m = month[mm];
if(((yy % 4 == 0 && yy % 100 != 0) || yy % 400 == 0) && m > 31)
m += 1;
weekday(dd, m, yy-1);
}
return 0;
}