a468 - 12439 - February 29
題目描述
題目要求計算兩個日期之間(包含兩個日期本身)的閏日數量。閏年的判斷規則為:能被 4 整除但不能被 100 整除,或者能被 400 整除的年份是閏年。
解題思路
對於給定的兩個日期,分別計算出截止到每個日期的閏年數量,然後相減即可得到兩個日期之間閏日的數量。計算閏年數量時,需要考慮年份的整除規則。由於題目保證第二個日期不早於第一個日期,因此只需要計算截止到每個日期的閏年數量,然後相減即可。需要特別注意的是,如果第二個日期是 2 月 29 日,則需要將閏年數量加 1。
複雜度分析
- 時間複雜度: O(T),其中 T 是測資數量。對於每個測資,需要進行常數次數的計算,因此時間複雜度為線性。
- 空間複雜度: O(1),程式碼使用的額外空間是常數級別的,不隨輸入大小變化。
程式碼
#include <iostream>
using namespace std;
int t,d,y,m1,m2,d1,d2,y1,y2;
char g;
string m,b[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int main(){
cin >> t;
for(int ca=1;ca<=t;++ca){
cin >> m >> d1 >> g >> y1;
int x=0,y=0;
for(int i=0;i<12;++i){
if(b[i]==m){
m1=i+1;
break;
}
}
if(m1<=2)
--y1;
x+=y1/4-y1/100+y1/400;
cin >> m >> d2 >> g >> y2;
for(int i=0;i<12;++i){
if(b[i]==m){
m2=i+1;
break;
}
}
if(m2<=2)
--y2;
y+=y2/4-y2/100+y2/400;
if(m2==2&&d2==29)++y;
cout << "Case " << ca << ": " << y-x << "\n";
}
}