用常规求日期的方法, 加上一些特判
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
#define endl '\n'
map<string, int> months ={
{"January", 1},
{"February", 2},
{"March", 3},
{"April", 4},
{"May", 5},
{"June", 6},
{"July", 7},
{"August", 8},
{"September", 9},
{"October", 10},
{"November", 11},
{"December", 12},
};
map<int, string> xingqi = {{1, "Monday"}, {2, "Tuesday"}, {3, "Wednesday"}, {4, "Thursday"}, {5, "Friday"}, {6, "Saturday"}, {7, "Sunday"}};
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
void check(int x, int &what_day)
{
int d = x % 100, m = x / 100 % 100, y = x / 10000;
if(d <= 0 || m != 2 && d > days[m]) return;
if(m < 1 || m > 12) return;
if(m == 2)
{
int leap = y % 400 == 0 || y % 4 == 0 && y % 100;
if(d > 28 + leap) return;
}
what_day ++;
if(what_day > 7) what_day = 1;
}
int main()
{
int d, y;
string month;
while(cin >> d >> month >> y)
{
int m = months[month];
int what_day = 1;
int day = d + m * 100 + y * 10000;
for(int i = 9990101; i <= day; i ++ )
{
if (i % 100 > 31) i += 68; //如果天数 > 31 那么必定不合法 +68后 = 0
if(i / 100 % 100 > 12) i += 8800; // 如果月份 > 12, + 88 * 100
check(i, what_day);
}
cout << xingqi[what_day] << endl;
}
return 0;
}
解法二
直接模拟每一天
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
#define endl '\n'
map<string, int> months ={
{"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 xingqi[] = {"Monday", "Tuesday","Wednesday","Thursday","Friday", "Saturday", "Sunday"};
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int get_leap(int y, int m)
{
if(m != 2) return days[m];
int leap = y % 400 == 0 || y % 4 == 0 && y % 100;
return days[m] + leap;
}
int main()
{
int d, y;
string month;
while(cin >> d >> month >> y)
{
int m = months[month];
int what_day = 0;
int i = 1, j = 1, k = 1;
while(i < y || j < m || k < d)
{
k ++, what_day ++;
if(k > get_leap(i, j))
{
k = 1;
j ++;
}
if(j > 12)
{
j = 1;
i ++;
}
}
cout << xingqi[what_day % 7] << endl;
}
return 0;
}