题目如上图所示。
解题思路:
运用基姆拉尔森计算公式:
W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
以公元元年为参考,公元元年1月1日为星期一
本题AC代码:
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int MonthToNum(string m){
if("January"==m) return 1;
if("February"==m) return 2;
if("March"==m) return 3;
if("April"==m) return 4;
if("May"==m) return 5;
if("June"==m) return 6;
if("July"==m) return 7;
if("August"==m) return 8;
if("September"==m) return 9;
if("October"==m) return 10;
if("November"==m) return 11;
if("December"==m) return 12;
return 0;
}
string numToDate(int d){
if(d==1) return "Monday";
if(d==2) return "Tuesday";
if(d==3) return "Wednesday";
if(d==4) return "Thursday";
if(d==5) return "Friday";
if(d==6) return "Saturday";
if(d==0) return "Sunday";
return "null";
}
bool isLeapYear(int year){
if((year%4==0&&year%100!=0)||(year%400==0)){
return true;
}
return false;
}
int main(){
int date,year,month,day=0;//分别是日期,年,月份,答案的数字形式
string strm;//输入的字符形式的月份
int D,c,y,m,d;
while(cin>>date>>strm>>year){
//将月份转化为数字
month=MonthToNum(strm);
if(month==1||month==2){
year--;
month+=12;
}
date=(date+2*month+3*(month+1)/5+year+year/4-year/100+year/400+1)%7;
cout<<numToDate(date)<<endl;
}
return 0;
}