閏年的計算問題

Terence_Jing發表於2016-12-05

閏年那些事兒


閏年(Leap Year)是為了彌補因人為曆法規定造成的年度天數與地球實際公轉週期的時間差而設立的。補上時間差的年份為閏年,這一年的2月有29天,其他年份都是平年,2月則只有28天。
判斷規則:公元年數可被4整除為閏年,但是整百的年數必須被400整除方為閏年,用程式說話就是:
bool  Is LeapYear(int year)
{
   return ((year%4==0&&year%100!=0)||(year%400==0));
}

理解是記憶的基礎,否則記了還是會忘掉,下面就說說為什麼會有這樣的判斷規則呢?
地球的公轉週期是365.2422個太陽日,按這個天數,地球圍繞太陽公轉一週後,並不是整整365個晝夜。因此,如果按照每年365天算,則每到四年,地球就和四年前的位置差了近一天。這一天的公轉距離需要閏一日來補足,因此一般每四年就會出現一個閏年。 0.2422 * 4 = 0.9688 < 1,因此每閏一次都會有點矯枉過正,造成了0.0312天的誤差。每100個閏年(即400年)會造成3.12天的誤差,為了減掉這個誤差,人們又規定,在第25個、第50個、第75個“閏年”處不閏(減掉多餘的3天),而在第100個閏年處保持閏年。

所以,才有了這樣的計算規則
Step1:如果年數可以整除400,則必定是閏年。
Step2:如果年數不能整除100可以整除4 (刨除第25/50/75個閏年),則是閏年。

按照這個規則,1900年不是閏年,而2000年是閏年,2100年則不是閏年。 
然而,這個定義還是沒有徹底的解決問題,因為還有0.0012天的誤差沒有完美地解決,到第3333.33年還會出問題,這個問題對於目前的我們來說,太過於久遠,那麼,就把它交給那個時代的人去解決吧!
 

 

相關文章