KY111 日期差值

KY111 日期差值
在这里插入图片描述

//分别求出每一个日期与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年闰年多计算了一天,在计算总天数时需要减去这些多计算的天数。
综上所述,将以上四个部分计算得出的值相加即可得到给定年份之前的总天数。这段代码利用了则和世纪闰年规则来精确计算每一年的天数,从而得到累计的总天数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿猿收手吧!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值