a263 - 日期差幾天
題目描述
題目要求計算兩個日期之間的相差天數。輸入包含兩個日期,每個日期由年、月、日組成。
解題思路
解題思路是將兩個日期都轉換成從一個基準日期(例如公元元年1月1日)開始的天數,然後計算這兩個天數的差的絕對值。程式碼中 e(int d,int g,int f) 函數計算從公元元年1月1日到指定日期(d年g月f日)的天數。函數首先計算 d 年的總天數(365 * d),然後加上閏年的天數。接著,它計算指定月份之前所有月份的天數總和。最後,如果日期是閏年且月份小於或等於 2,則減去 1 天。主函數讀取兩個日期,分別計算它們的天數,然後輸出它們天數差的絕對值。
複雜度分析
- 時間複雜度: O(N),其中 N 是輸入的筆數。因為對於每組輸入,
e函數的迴圈最多執行 12 次,可以視為常數時間。 - 空間複雜度: O(1),程式碼使用的額外空間是常數級別。
程式碼
#include <iostream>
#include <math.h>
using namespace std;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int e(int d,int g,int f){
int c=d*365;
for(int b=0;b!=d+1;b++)
if(b%4==0&&b%100!=0||b%400==0)
c++;
c+=f;
for(int b=0;b!=(g-1);b++)
c=c+a[b];
if((d%4==0&&d%100!=0||d%400==0)&&((g<2)||(g==2&&f<=29)))
c--;
return c;
}
int main(int argc, char** argv){
cin.tie(0);
ios::sync_with_stdio(false);
int b[2],c[2],d[2];
while(cin>>b[0]>>c[0]>>d[0]>>b[1]>>c[1]>>d[1])
cout<<abs(e(b[0],c[0],d[0])-e(b[1],c[1],d[1]))<<'\n';
}