1. 程式人生 > >藍橋杯 日曆問題 計算兩個日期的時間差

藍橋杯 日曆問題 計算兩個日期的時間差



人類歷史上出現了很多種曆法。現行的公曆即格里曆由儒略曆改革而來。它是目前較為精確和規則簡明的一種曆法,約3300年誤差一日。因為閏年問題以及每個月的長度不等,仍然使得某些計算較為麻煩。比如:求兩個日期間差多少天。
下面的程式碼實現了求兩個由公曆表示的日期間差多少天的功能。
其計算原理是先求出每個日期距離1年1月1日的天數差值,再進一步做差即可。
請研讀程式碼,填寫缺失的部分。


把填空的答案(僅填空處的答案,不包括題面)存入考生資料夾下對應題號的“解答.txt”中即可。


struct MyDate
{
int year;
int month;
int day;
};


int GetAbsDays(MyDate x)
{
int i;
int month_day[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int year = x.year-1;  // 因為欲求距離1年1月1日的距離
int days = year * 365 + year/4 - year/100 + year/400;
if(x.year%4==0 && x.year%100!=0 || x.year%400==0) month_day[1]++;
for(i=0; i<______________; i++)
days += month_day[i];
days += x.day-1;
return days;
}


int GetDiffDays(MyDate a, MyDate b)
{
return GetAbsDays(b) - GetAbsDays(a);
}


int main(int argc, char* argv[])
{
MyDate a = {1842,5,18};
MyDate b = {2000,3,13};
int n = GetDiffDays(a,b);
printf("%d\n", n);

}

這還真是一個比較好的演算法,要計算兩個日期的時間差,先計算每一個日期到1年1月1日的時間,然後再計算這兩個天數的差值,這樣做思路特別清晰,因為不用考慮哪個年在前,哪個年在後的問題,在計算的時候,還有幾個我認為是亮點:

1.將每一個月的天數存到一個數組當中,這樣做就不用使用n多的if了,不過其實有一個優化的地方,就是12月份的天數其實不用存,因為計算的時候永遠也用不到這一天。

2.days = year * 365 + year/4 - year/100 + year/400;這句話用來計算n年距離1年的天數差,仍然寫的非常簡練,其中 year/4 - year/100和year/400是閏年的天數

3.動態修改每個月的天數的陣列

看來可以考慮以後使用這種方法來計算了,我之前整理了一篇,那個還需要考慮正負之間的問題。

最後,那個空著的地方當然就是計算每個月的天數之和,不過,就像int year = x.year-1;這句話一樣,不要忘了是計算的差值,所以需要使用x.month-1才行。