让你能够口算天数神级数学公式!

如求出一个日期到另一个日期过了多少天呢?

很显然的,我们可以使用——

暴力模拟

这应该是最容易想到的方法了,但问题是代码量很大:

·判断平闰年

·计算每个月天数

·考虑日期大小关系

·其他细节

可是,只是为了求两个日期之间的日子,真的需要这么复杂的代码吗?

我们考虑一下使用数学方法(容斥原理)如何解决此类问题

数学方法

求两个日期之间的相对差值会较为麻烦,因此我们考虑分别求出每个日期对一个固定时间(设为1年1月1日)的绝对差值,然后两式相减即可。

首先,每一年的“基础天数”为 \(y*365\)

接着考虑闰年对年份的影响:每四年一个闰年,每一百年少一个闰年,每四百年多扣除了一天,于是修正的天数为 \(y÷4-y÷100+y÷400\)

最后,也是最麻烦的地方,我们需要判断2月在平闰年对天数的影响状况,这里列出几个式子:

\(31+30+31+30+31=153\)

\(457-365=92\)

\(92=31+30+31\)

\(365-31-28=306\)

根据容斥原理,我们需要作出以下修正:

\((153*m-457)/5+d-306\)

于是,最终结果长成这个样子:

\(365*y+y/4-y/100+y/400+(153*m-457)/5+d-306\)

利用上面的公式,我们就可以计算出某一个日期距离公元第一天的天数之差,分别计算后两数相减即可解决开篇提出的问题

这里放一下代码

long long Calculation(int y,int m,int d)
{
    if (m<3) {y-=1;m+=12;}
    return  365*y+y/4-y/100+y/400+(153*m-457)/5+d-306;
}

https://home.cnblogs.com/u/tqr06/

https://www.cnblogs.com/tqr06/p/10400144.html

转载于:https://www.cnblogs.com/tqr06/p/10380574.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值