讓你能夠口算天數神級數學公式!


如求出一個日期到另一個日期過了多少天呢?

很顯然的,我們可以使用——

暴力模擬

這應該是最容易想到的方法了,但問題是代碼量很大:

·判斷平閏年

·計算每個月天數

·考慮日期大小關系

·其他細節

可是,只是為了求兩個日期之間的日子,真的需要這么復雜的代碼嗎?

我們考慮一下使用數學方法(容斥原理)如何解決此類問題

數學方法

求兩個日期之間的相對差值會較為麻煩,因此我們考慮分別求出每個日期對一個固定時間(設為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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM