如求出一個日期到另一個日期過了多少天呢?
很顯然的,我們可以使用——
暴力模擬
這應該是最容易想到的方法了,但問題是代碼量很大:
·判斷平閏年
·計算每個月天數
·考慮日期大小關系
·其他細節
可是,只是為了求兩個日期之間的日子,真的需要這么復雜的代碼嗎?
我們考慮一下使用數學方法(容斥原理)如何解決此類問題
數學方法
求兩個日期之間的相對差值會較為麻煩,因此我們考慮分別求出每個日期對一個固定時間(設為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;
}


