【日期】确定母亲节

【日期】确定母亲节

母亲节是每年的五月第二个星期天,针对输入的年份,计算该年的哪一天是母亲节。

输入:

年份

输出:

日期(5月的哪一天)

样例:

序号测试输入期待的输出额外进程
12014↵11↵0
22015↵10↵0
32012↵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;
}  

显然代码简洁了不少,这说明在优化此类问题的时候,从数学模型的角度入手是一个好的的切入点

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值