日期问题题解大合集
算法1
我们先把月、每月的天数、星期给打表好
string month[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
string week[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
long long day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
接着我们输入多组d
、m
、y
因为题目说明,已知 1 年 1 月 1 日是星期一。,所以我们在算已过的天数的时候,要把y-1
年的天数给一道加起来
为什么不是加到y
年呢?
因为第y
年不一定结束了,所以我们要加到y-1
年
我们在累加的时候要记得闰年是366天,而不是闰年是365天:
if(i%4==0&&i%100!=0||i%400==0)s+=366;
else s+=365;
接着我们来看第y
年过去了几天
我们先判断一下是不是闰年:
if(y%4==0&&y%100!=0||y%400==0)day[2]=29;
else day[2]=28;
接着我们看是哪一个月
由于我们之前已经打过表,所以我们就好办了:
for(long long i=1;i<=12;i++)
if(month[i]==m){
n=i;
break;
}
n
的值就是第几月
我们加上多余的天数d
,然后再减个1
最终我们把第y
年已经过去的天数c
加上前y
年过去的天数s
相加,Mod7即可,我们最终输出week[(s+c)%7]
即可
参考文献
C++ 代码
#include<bits/stdc++.h>
#define __int128 long long
using namespace std;
string month[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
string week[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
long long day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
long long y,d;
string m;
while(cin>>d>>m>>y){
long long s=0,c=0,n=0;
for(long long i=1;i<=y-1;i++){
if(i%4==0&&i%100!=0||i%400==0)s+=366;
else s+=365;
}
if(y%4==0&&y%100!=0||y%400==0)day[2]=29;
else day[2]=28;
for(long long i=1;i<=12;i++)
if(month[i]==m){
n=i;
break;
}
for(long long i=1;i<=n;i++)c+=day[i];
c+=d;
c--;
cout<<week[(s+c)%7]<<'\n';
}
}