思路: 將它們轉換為自公元1年1月1日以來的天數,最後再求兩個天數之差就可以得到天數差,具體步驟如下:
1.計算年份差異: 將要計算的日期所在的年份減去公元1年,再乘以365,即為年份差異的天數(先將所有年份天數先視為365天,後面再一齊加回)。
EX:1024年比公元1年多了1023年,年份差異的天數為(1024-1)*365=373395天。
2.加上閏年天數: 閏年是指西元年份可以被4整除但不能被100整除,或者可以被400整除的年份。EX:要計算在1024年之前的閏年天數,可以將年份減1後再除以4,再減年份減1後再除以100,再加年份減1後再除以400,即可得到之前的閏年總天數。所以西元1024年之前閏年的總天數為 255-10+2 =247天。
3.加上當年的天數: EX:1024年5月1日 = 1月到4月的天數(閏年超過二月要加1))+ 5月的幾天 =>(31+28+31+30+1)+1 = 122 天
4.最後再將上面加總: 1024年5月1日=(1024-1)*365 + (1024-1)/4 - (1024-1)/100 + (1024-1)/400 +122 = 373764天。
具體程式如下:
#include <iostream>
#include <cmath>
using namespace std;
int days_month[]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //先將所有年份每月天數一視同仁,後面再補回
bool leap(int year)
{
return (year%4==0 && year%100!=0) || year%400==0; //判斷閏年
}
int days(int year,int month, int day)
{
for(int i=0;i<month-1;i++) //5月5日=>i=0~3 =>31 28 31 30 前四個月天數再加5月的幾天 = 125天
day+=days_month[i];
if (month>2 && leap(year)) day++; //如果是閏年且過了2月,還要再加上一天
return day+365*(year-1)+(year-1)/4-(year-1)/100+(year-1)/400; //等於當年的天數(days)+年份差異天數+加上閏年天數
}
int main()
{
int y1,m1,d1,y2,m2,d2;
while(cin>>y1>>m1>>d1>>y2>>m2>>d2)
{
cout<<abs(days(y1,m1,d1)-days(y2,m2,d2))<<endl;
}
return 0;
}