Day of Week题意
-
给你一个日期,你算出那天是星期几
输入
9 October 2001 14 October 2001
输出
Tuesday Sunday
思路
- 模拟
- 我是以2021年12月31号作为起点,向前or向后算日期,因为我一开始很震惊如果上机的时候不记得几号,星期几怎么办,然后就打算直接用当天来算。
- 然后我意识到,上机有电脑!!!
- 以2021.12.31作为起点
- 先算到要求的年份的12月31日星期几
- 然后算要求的月份的31号周几
- 然后再算要求的日子
- 向前和向后主要区别
- 年份的日子取模的时候,往过去的年份是减去当年的日子,而往未来的年份是加上未来的日子。
- 注意要判断闰年
代码
#include<bits/stdc++.h>
using namespace std;
int date[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string strm[13]={"","January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"};
string strw[7] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
int y, m, d;
int yearcnt = 0;
int my = 2021, mm = 12, md = 31, mw = 4;
bool isLeap(int year){
if((!(year%4)&&(year%100))||!(year%400)){
date[2]=29;
yearcnt = 366;
return true;
}
else{
date[2]=28;
yearcnt = 365;
return false;
}
}
int main(){
string str;
while(cin>>d>>str>>y){
for(int i=1;i<13;i++)
{
if(str.size()==strm[i].size() && str==strm[i]){
m = i;
break;
}
}
int iy, im, id, iw=mw;
for(iy = my; iy!=y; ){
// 注意这里未来和过去的区别!
if(y>iy){
// 要加上未来一年的日子,而不是现在这一年
isLeap(++iy);
iw = (iw+(yearcnt%7))%7;
}
else{
// 要减去这一年的日子
isLeap(iy);
iw = (iw-(yearcnt%7)+7)%7;
iy--;
}
}
isLeap(iy);
for(im = mm; im!=m; ){
if(m>im){
iw = (iw + date[im]%7)%7;
im++;
}
else{
iw = (iw - date[im]%7 + 7) % 7;
im--;
}
}
if(date[im]<d){
iw = (iw + (d - date[im])%7)%7;
}
else{
iw = (iw - (date[im] - d)%7 + 7)%7;
}
cout<<strw[iw]<<endl;
}
return 0;
}