//分别求出每一个日期与0000年0月1日距离的天数
//两个距离天数相减即可得到两个日期相差的天数
int mon[12] = { 0,31,59,90,120,151,181,212,243,273,304,334 };
int CountDay(int y, int m, int d)
{
//x-y-z:算出x年之前有多少天 算出y月之前有多少天
//格里高利历(Gregorian Calendar)中的闰年规则
int yearDay = y * 365 + y / 4 - y / 100 + y / 400;
int monthDay = mon[m - 1];
//如果样例的月份是3往后的月份需要考虑该年是平年闰年的影响
if (m > 2 && ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0))
monthDay += 1;
return yearDay + monthDay + d;
}
int main()
{
int year1, month1, day1;
scanf("%4d%2d%2d", &year1, &month1, &day1);
int n1 = CountDay(year1, month1, day1);
int year2, month2, day2;
scanf("%4d%2d%2d", &year2, &month2, &day2);
int n2 = CountDay(year2, month2, day2);
//如果两个日期是连续的我们规定他们之间的天数为两天
cout << abs(n1 - n2) + 1 << endl;
}
代码可以计算出给定年份之前的总天数,其中的计算公式是根据格里高利历(Gregorian Calendar)中的闰年规则所得出的。
具体解释如下:
y * 365:先将给定年份乘以365,表示每一年都有365天。
y / 4:然后将给定年份除以4,表示在这些年份中有多少个闰年。因为每4年会有一个闰年,所以将年份除以4得出的整数部分就代表了闰年的个数。而每个闰年会额外增加一天,所以将闰年的天数加上去。
y / 100:接下来将给定年份除以100,表示在这些年份中有多少个世纪闰年。因为每100年会有一个世纪闰年,即不能被400整除的年份不是闰年。所以将年份除以100得出的整数部分就代表了世纪闰年的个数。但是这些世纪闰年多计算了一天,在计算总天数时需要减去这些多计算的天数。
y / 400:最后将给定年份除以400,表示在这些年份中有多少个400年闰年。因为每400年会有一个400年闰年,即能被400整除的年份是闰年。所以将年份除以400得出的整数部分就代表了400年闰年的个数。但是这些400年闰年多计算了一天,在计算总天数时需要减去这些多计算的天数。
综上所述,将以上四个部分计算得出的值相加即可得到给定年份之前的总天数。这段代码利用了则和世纪闰年规则来精确计算每一年的天数,从而得到累计的总天数。