一只小弱渣对Problem3322一种易懂的解法

10175101159 edited 6 年,6 月前

网络上的各种公式都比较难记,下面给出一种通俗易懂的解法:

我们知道,随着日期数的增加,星期数以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 花自飘零水自流

Comments

10175101159

第一次发blog 并不会排版
代码头文件也被吃掉了
懒得改 就酱

Mr.wu_

10175101282

代码用三个`括起来就可以啦,像这样:

#include <stdio.h>

int main(void)
{
    printf("Hello World!\n");
    return 0;
}
10175101159

谢大触

10175101282

%dalao