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