第一次发blog 并不会排版
代码头文件也被吃掉了
懒得改 就酱
10175101159 edited 7 年,1 月前
网络上的各种公式都比较难记,下面给出一种通俗易懂的解法:
我们知道,随着日期数的增加,星期数以7为周期变化
所以我们只要计算给定日期是从公元0001年01月01日开始的第几天
再对这个天数(d)取余数(mod7)即可
d%7的7种结果(0,1,2,…,6)唯一对应周一至周日的某一天
尽管我们可能不知道0001年01月01日是星期几,但我们可以通过题给样例调整
可能的调整结果有:(d+0)%7,(d+1)%7,(d+2)%7,…,(d+6)%7
显然其中有且仅有一种是正确的,利用样例确定是哪一个就好了
本题OJ评测系统并未考虑【罗马教皇删除10天】的问题
如若考虑,只需要对日期分两类,依次使用前述“累加再取模”的方法即可
附参考代码:
#include<cstdio>
#include<iostream>
using namespace std;
int y,m,d,n,i;
int a[]={0,0,31,59,90,120,151,181,212,243,273,304,334};//用数组保存第i个月前面(i-1)个月的所有天数
string b[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};//用数组保存待输出的字符串,便于输出
int main()
{
scanf("%d-%d-%d",&y,&m,&d);
for(i=8;i<=y;i++)if((i%4==0&&i%100!=0)||i%400==0)n++;//累加0001-y年的2.29天数(判断闰年)
n+=365*(y-1),n+=a[m],n+=d;//利用数组a[]累加0001-01-01到y-m-d的天数
if(((y%4==0&&y%100!=0)||y%400==0)&&m<3)n--;//上两行中,如果今年是闰年且给的月份比3小,那么2.29这天被多算了1次,应当减掉
cout<<b[(n+0)%7];//n%7,调整剩余类,0是根据样例得到的调整数
return 0;
}
以上。
By 花自飘零水自流
谢大触