题目描述
已知 1 年 1 月 1 日是星期一。
现在给定一个日期,请你判断是星期几。
注意闰年的 2 月有 29 天。
满足下面条件之一的是闰年:
年份是 4 的整数倍,而且不是 100 的整数倍;
年份是 400 的整数倍。
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
int flag[3010];//falag[i]代表前i年(不包括i年)中的闰年的数量;
int month_length[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int month_acc[13];
unordered_map <string,int> month_map;
unordered_map <int,string> day_map;
bool isRunYear(int year){
if(year%4==0&&year%100!=0){
return true;
}
else if(year%400==0){
return true;
}
else return false;
}
int main()
{
month_map["January"] = 1;
month_map["February"] = 2;
month_map["March"] = 3;
month_map["April"] = 4;
month_map["May"] = 5;
month_map["June"] = 6;
month_map["July"] = 7;
month_map["August"] = 8;
month_map["September"] = 9;
month_map["October"] = 10;
month_map["November"] = 11;
month_map["December"] = 12;
day_map[1] = "Monday";
day_map[2] = "Tuesday";
day_map[3] = "Wednesday";
day_map[4] = "Thursday";
day_map[5] = "Friday";
day_map[6] = "Saturday";
day_map[0] = "Sunday";
int cnt = 0;
for(int i=1;i<=3000;i++){
if(isRunYear(i)){
cnt++;
}
flag[i+1] = cnt;
}
for(int i =1 ;i<=12;i++){
month_acc[i]=month_length[i]+month_acc[i-1];//累计月份
}
int day;
string month;
int year;
while(cin>>day>>month>>year){
day =day+flag[year]*366+(year-flag[year]-1)*365;//处理完年
int month_num = month_map.find(month)->second;
if(isRunYear(year)&&month_num>2){
day += month_acc[month_num-1]+1;
}
else day += month_acc[month_num-1];
cout << day_map.find((day)%7)->second<<endl;
}
}