# Date Calculation# Mathematical Conversion# Basic Simulation

a263 - 日期差幾天

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算兩個日期之間的相差天數。輸入包含兩個日期,每個日期由年、月、日組成。

解題思路

解題思路是將兩個日期都轉換成從一個基準日期(例如公元元年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';
}

Discussion