2010-06-12 165 views
-1

可能重複正確的表達:
how to find leap year?檢查閏年

會有什麼閏年的確切定義是什麼?據我所知「一年是能被4整除的是閏年,但世紀年,這是被400整除的年是閏年。

但這個定義做了100,200,300,400。 ...高達1700年不是LEAP年!但在公曆中,所有這些都是閏年,check this out

你也可以在Linux中嘗試「調用1700」來驗證。

所以,正確的算法閏年是:

if ((year % 4 == 0) && (year <= 1700 || year % 100 != 0 || year % 400 == 0)) 
    printf("%d is a leap year.\n", year); 
else 
    printf("%d is not a leap year.\n", year); 

但這是具體到陽曆?即使是這樣,爲什麼沒有提到here

問候,

PS:公曆卡倫德的歷史似乎有趣退房September month of 1752

回答

2

我覺得分離想法很重要一方面是歷史日期,另一方面是日期計算。歷史日期受到各種政治,社會和技術問題的影響,因此不適合簡單的算法。請參閱this page,以瞭解現代公曆日曆的廣泛差異。

計算日期的通常做法是忘記歷史記錄,只是假裝現有的系統始終到位並始終就位。 (除非你是天文學家或某些其他類型的科學家,在這種情況下,你會使用更精確的東西,並且會對歷史日期更不感興趣)。如果你的應用程序全部是關於記錄的歷史日期,那麼你將要需要一種方法將這些日期(取決於國家,歷史時期等)映射到更易於計算的通用約會系統。

0

看一看here。我將複製一些僞代碼以供參考:

if (year modulo 4 is 0) and ((year modulo 100 is not 0) or (year modulo 400 is 0)) 
     then is_leap_year 
else 
     not_leap_year 
+0

認沽括號

所以回答你的問題將是等效的。就目前而言,你的陳述是不明確的。 (海灣合作委員會會給類似的C代碼警告)我如何解釋這取決於我的操作順序,這是僞代碼相當未定義。 – Thanatos 2010-06-12 17:34:41

+0

感謝您的輸入,我只是複製了文章中的代碼,並沒有注意到問題 – 2010-06-12 17:59:26

2

首先,您的算法有點不合適。它更像是:

if ((year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)) 
    printf("%d is a leap year.\n", year); 
else 
    printf("%d is not a leap year.\n", year); 

此外,公曆還沒有被採用,直到1582左右。

編輯:

的公曆頒佈於1582年,但在不同時間由不同國家所採用,遲至1926年在土耳其。

+0

它在不同的地方在不同的時間被採用。例如,直到20世紀,俄羅斯才採用。 – 2010-06-12 17:16:16

+0

它於1752年9月在英國通過,因此當年的「有趣」月份,因爲日曆顯示的是Julian而不是Gregorian。 – 2010-06-12 17:18:11

+0

這是一個很好的觀點。我認爲1582年可能是它提出的那一年。 – 2010-06-12 18:42:10

0

副本。 1752年9月間差距的原因在於,當英國從朱利安轉換爲公曆時,這不是公曆中的差距,而是兩者之間的差異。

您鏈接到的頁面使用Julian日曆,直到該點。因此,用於計算閏年的算法與頁面(或英國,或英國,雖然在AD 100中不存在)在1752年之前計算的方式不同。

0

如果您的平臺具有Date數據類型,那麼您的第一次嘗試就是使用它所具有的任何日期表達式和操作功能。通常這些都是足夠的,你可以省去承擔支持YA日期處理庫的責任的麻煩。如果(存在( 「2月29日/ YYYY」 .toDate))的周圍和/或...