題目連結
題意:
一般而言,我們知道每 4 年會出現一次 2月有 29 天
多出來的 2/29 叫做 leap day (閏日)
題目先告知閏日的規則:
西元年為4的倍數會閏;100的倍數不閏;400的倍數卻又閏
即,西元 4, 8, ... 會閏
但遇到西元100, 200, 300, 500, ... 不閏(400倍數可閏)
其實這樣的規則還少了4000的倍數又不閏,但此題依照題意描述為準
相關規定可以參考 這則新聞
解法:
計算一段區間內的值,最快的做法就是計算頭尾兩者之差
如上圖,以西元0年為基準
假設測資頭尾是 a 與 b
先個別統計從0年到a b的閏日數(leap a, leap b)
兩者相減即為所求
根據規則,要計算leap數
拿該西元年/4後,扣掉/100的值,再加上/400就是了
還要探討兩個條件:
1. 若 a 或 b 的年份恰好為閏年
上述的 leap 計算是包含該年
如果日期是1/1~2/28,該年的閏日是不能加進去的
例如:
西元4年 1/2,如果不判斷,leap數是1
事實上從0年到此區間leap是 0 (把西元4年算進去了)
2. 計算頭的時候,如果日期恰好為2/29,也要先扣掉
否則頭尾都會計算到,相減時就抵銷了
例如:
西元4年 2/29 ~ 西元4年 3/2,如果不先扣,leap數分別都是1
相減為0,但這個區間是有一個leap的(即2/29)
程式(Java):
題意:
一般而言,我們知道每 4 年會出現一次 2月有 29 天
多出來的 2/29 叫做 leap day (閏日)
題目先告知閏日的規則:
西元年為4的倍數會閏;100的倍數不閏;400的倍數卻又閏
即,西元 4, 8, ... 會閏
但遇到西元100, 200, 300, 500, ... 不閏(400倍數可閏)
其實這樣的規則還少了4000的倍數又不閏,但此題依照題意描述為準
相關規定可以參考 這則新聞
測資方面,先告知會有幾組,每組有兩行分別代表一段區間頭尾
要計算這段區間內的閏日數(即 2/29出現次數)
計算一段區間內的值,最快的做法就是計算頭尾兩者之差
如上圖,以西元0年為基準
假設測資頭尾是 a 與 b
先個別統計從0年到a b的閏日數(leap a, leap b)
兩者相減即為所求
根據規則,要計算leap數
拿該西元年/4後,扣掉/100的值,再加上/400就是了
還要探討兩個條件:
1. 若 a 或 b 的年份恰好為閏年
上述的 leap 計算是包含該年
如果日期是1/1~2/28,該年的閏日是不能加進去的
例如:
西元4年 1/2,如果不判斷,leap數是1
事實上從0年到此區間leap是 0 (把西元4年算進去了)
2. 計算頭的時候,如果日期恰好為2/29,也要先扣掉
否則頭尾都會計算到,相減時就抵銷了
例如:
西元4年 2/29 ~ 西元4年 3/2,如果不先扣,leap數分別都是1
相減為0,但這個區間是有一個leap的(即2/29)
程式(Java):
留言
張貼留言