#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可得周几。