日期转化为星期
■
■
■
\blacksquare\blacksquare\blacksquare
■■■
最直接的方式是套用公式(蔡基姆拉尔森计算公式)
设 星期 w 日 d 月 m 年 y
这时需要:
一个 d
m * 2 + 3 * (m - 1) * 5
一个 y
y / 4 - y / 100 + y / 400
那么 w =
( d + m * 2 + 3 * (m - 1) * 5 + y + y / 4 - y / 100 + y / 400 ) % 7 + 1
注意每年的 1 、2 月要当成上一年的 13 、 14 月计算
■ ■ ■ \blacksquare\blacksquare\blacksquare ■■■
- 题目描述
已知 1 年 1 月 1 日是星期一。
现在给定一个日期,请你判断是星期几。
注意闰年的 2 月有 29 天。
满足下面条件之一的是闰年:
年份是 4 的整数倍,而且不是 100 的整数倍;
年份是 400 的整数倍。
- 输入格式
输入包含多组测试数据。
每组数据占一行,包含一个整数 d 表示日,一个字符串 m 表示月,一个整数 y 表示年。
- 输出格式
每组数据输出一行结果,输出一个字符串表示给定日期是星期几。
- 数据范围
1000 ≤ y ≤ 3000,
给定日期保证合法。
每个输入最多包含 100 组数据。
- 输入样例:
9 October 2001
14 October 2001
- 输出样例:
Tuesday
Sunday
#include <iostream>
#include <cstdio>
#include <unordered_map>
using namespace std;
int mdays[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
unordered_map<string, int> mname = {
{"January", 1},
{"February", 2},
{"March", 3},
{"April", 4},
{"May", 5},
{"June", 6},
{"July", 7},
{"August", 8},
{"September", 9},
{"October", 10},
{"November", 11},
{"December", 12}
};
string wname[8] = {
" ", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"
};
int if_leap(int year){
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
int getmdays(int year, int mon){
int temp = mdays[mon];
if(mon == 2) temp = mdays[mon] + if_leap(year);
return temp;
}
int main(){
int d, m, y;
string str;
while(cin >> d >> str >> y){
m = mname[str];
int i = 1, j = 1, k = 1, days = 0;
while(i < y || j < m || k < d){
k ++, days ++;
if(k > getmdays(i, j)){
k = 1;
j ++;
if(j > 12){
j = 1;
i ++;
}
}
}
cout << wname[days % 7 + 1] << endl;
}
return 0;
}