題目連結
題意:
一般而言,我們知道每 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):
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.*; | |
public class Main { | |
public static int getleap(String s, boolean front) { | |
String str[] = s.split(" "); | |
String Month = str[0]; | |
int day = Integer.valueOf(str[1].substring(0, str[1].length() - 1)); | |
int year = Integer.valueOf(str[2]); | |
if ((year%4 == 0 && year%100 != 0) || year%400 == 0) { | |
if (Month.equals("February") && day == 29) { // 2/29 | |
if (front) | |
year--; | |
} | |
else if (Month.equals("January") || Month.equals("February")) // 1/1~2/28 | |
year--; | |
} | |
return year/4 - year/100 + year/400; | |
} | |
public static void main(String args[]) { | |
Scanner sc = new Scanner(System.in); | |
int T = Integer.valueOf(sc.nextLine()); | |
for (int t = 1; t <= T; t++) { | |
int leap1 = getleap(sc.nextLine(), true); | |
int leap2 = getleap(sc.nextLine(), false); | |
System.out.println("Case " + t + ": " + (leap2-leap1)); | |
} | |
} | |
} |
留言
張貼留言