蓝桥杯 日历问题 计算两个日期的时间差

来源:互联网 发布:moe软件简介 编辑:程序博客网 时间:2024/05/16 19:37


人类历史上出现了很多种历法。现行的公历即格里历由儒略历改革而来。它是目前较为精确和规则简明的一种历法,约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才行。

0 0