12439: February 29 ★☆☆☆☆ 題組:Problem Set Archive with Online Judge 解題者:吳培恩 解題日期:2018年3月15日 題意:每次輸入兩個日期,求這兩個日期之間包含多少個閏日,若輸入的日期及為閏日,也要算在閏日差裡。閏年規則為能被4整除的年份,但如果被100整除的年份則不算,不過被400整除也算是閏年。
題意範例: Sample input Sample output 3 January 12, 2012 March 19, 2016 Case1: 2 August 12, 2899 August 12, 2901 Case2: 0 February 29, 2012 February 29, 2012 Case3: 1 解法:用這題要我們求兩個日期之間包含多少閏日,只要以西元0年為基準點,分別求出這兩個日期所包含的閏日數,然後再相減即可。 可直接用集合法算閏年,方法為將 年份/4 - 年份/100 (每100年不算) +年份/400 (每400年要算)。 若輸入的日期及為閏日,也要算在閏日差裡,解決方法為若輸入的第一個日期為閏日,不算入閏日數裡,若第二個輸入的日期為閏日,則算入閏日裡,這樣兩者相減結果及為兩日期的閏日差。
解法範例: // Ya = Date1的年份, Yb = Date2 的年份, N為閏日個數 if(month[i][0]=="January"||month[i][0]=="February") Ya--; if(month[i][1]=="January"||month[i][1]=="February") if(!(month[i][1]=="February"&&day[i][1]==29)) Yb--; Na = Ya/4 - Ya/100 + Ya/400; Nb = Yb/4 - Yb/100 + Yb/400; N = Nb - Na; 討論: 1. 閏年的判斷方法其實還有一個規則,除了每逢100年 的倍數不算閏年,其實每逢4000年也一樣不算閏年,若 把這點考慮進去的話,該怎麼算呢?