【日期】确定母亲节
母亲节是每年的五月第二个星期天,针对输入的年份,计算该年的哪一天是母亲节。
输入:
年份
输出:
日期(5月的哪一天)
样例:
序号 | 测试输入 | 期待的输出 | 额外进程 |
---|---|---|---|
1 | 2014↵ | 11↵ | 0 |
2 | 2015↵ | 10↵ | 0 |
3 | 2012↵ | 13↵ | 0 |
思路
五月的第二个星期日,也就是说输出范围应该是属于[1,14]的一个整数,那我们不妨先计算出每年的五月十四日是星期几再向前倒退对应天数就可以得到我们想要的结果,自然地,我们想到利用之前写过的代码 根据日期求星期
流程图
代码
#include<stdio.h>
int a[13]={0,31,28,31,30,31,30,31,31,30,31};
int Weekday(int y){
int d=14,m=5;
if(y%4==0&&y%100!=0||y%400==0)
a[2]=29;
int ans=d,i;
for(i=1;i<=m-1;i++){
ans+=a[i];
}
int s,r;
s=y-1+(y-1)/4-(y-1)/100+(y-1)/400+ans;
return r=s%7;
}
int main()
{
int y;
scanf("%d",&y);
printf("%d\n",14-Weekday(y));
return 0;
}
课外思考
这里我们将之前写过的代码当做了一个函数,将原本的输入月份和日期改为了直接赋值,那是否还能简化这段代码呢?
事实上,因为母亲节必然在五月,所以我们已经没必要讨论输入的年份是否为闰年,因为五月已经包括了二月,我们只需要算出N+1年总共的天数再减去245(每年五月十四之后的天数,这是固定的)
代码
#include<stdio.h>
int main()
{
int y;
scanf("%d", &y);
int day;
day = (y+(y)/4-(y)/100+(y)/400-245) %7;
printf("%d\n", 14-day);
return 0;
}
显然代码简洁了不少,这说明在优化此类问题的时候,从数学模型的角度入手是一个好的的切入点