#include<bits/stdc++.h>
#include<map>
using namespace std;
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void leapYear(int y) {
// 判断是否为闰年
if (y % 400 == 0 || y % 100 != 0 && y % 4 == 0) {
month[2] = 29;
} else
month[2] = 28;
}
//一年的天数
int dayOfYear(int y) {
if(y % 400 == 0 || y % 100 != 0 && y % 4 == 0)
return 366;
else
return 365;
}
//目标日期与0000年0月0日相差多少天
int distance(int y, int m, int d) {
int sum = 0;
for(int i = 0; i < y; i++) {
sum += dayOfYear(i); //切记此处是i而不是y,debug了老半天
}
leapYear(y);//判断次年是否为闰年并赋值二月天数
for(int i = 1; i < m; i++) {
sum += month[i];
}
sum += d;
return sum;
}
string WeekName(int d) {
// Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
switch(d) {
case 0:
return "Sunday";
case 1:
return "Monday";
case 2:
return "Tuesday";
case 3:
return "Wednesday";
case 4:
return "Thursday";
case 5:
return "Friday";
case 6:
return "Saturday";
}
return "";
}
int main() {
char monthName[12];
int d, y, m;
int length;
map<string, int> mapSet = {{"January", 1}, {"February", 2}, {"March", 3}, {"April", 4}, {"May", 5}, {"June", 6}, {"July", 7}, {"August", 8}, {"September", 9}, {"October", 10}, {"November", 11}, {"December", 12}};
while(scanf("%d %s %d", &d, monthName, &y) != EOF) {
m = mapSet[monthName];
length = distance(y, m, d) - distance(2000, 1, 1); //2000.01.01 周六
// 根据日期差额计算周几
int dayNumber = (length % 7 + 6) % 7;
cout << WeekName(dayNumber) << endl;
}
return 0;
}
计算所给日期是周几,可拆分为:
①对输入进行转化(字符串转整型);
②计算目标日期与某个特定日期相差多少天;
③相差的天数模7可得周几。

京公网安备 11010502036488号