你活了多少天

废话不多说,我们直接上题目:
在这里插入图片描述
看到这道题,很多人都可能感觉有点无从下手,你可能第一次想到的方法是分闰年和非闰年,但是你一想到闰年后还有二月,二月分28天和29天,什么两年之间还有那么多年需要分类,你可能感觉很麻烦,两个月之间也有那么多情况,你可能就退缩了,对这个题提不起兴趣,就是不会做,不知道从何做起,也不想做,不要问我为什么知道,因为,我就是这样。
好好好,上面我把我们做题前的主要可能遇到的问题都列举了一遍,但是,我们总要向前看,总要寻求进步,所以我们必须学会学会它;好咱们废话不多说了,上主题:
思路:

  1. 这个题我们年份为突破口,现将年份分为闰年和非闰年(这个分年份的目的就是为了确定二月到底是28天还是29天,因为一年之中不是就只有二月的天数会变吗)。
  2. 思路:我们可以先从年开始考虑,就是将我们输入的两个年份 y1 和 y2 先拆分,但此拆分非彼拆分,这里的拆分是指我们把求 y1 到 y2 这一段时间分成了先求 y1+1前的时间再求y1+1 和 y2-1 的间隔再求 y2-1 之后的时间段 ,(在这里不要惊讶,你没有看错,这里就是 y1 +1 和 y2 -1),但是为什么呢?原因:因为:我们输入的年份一般都是几几年几月几日吧(如2023 年11月13日)。所以我们在算两年之间的间隔的时候总会出现前面的年只需要算该年内后面的天数,而后面的年需要算该年内前面的天数(这可能说起来比较抽象,但是,相信你看了下面的例子你就会明白),
    例 : 如果我们算2021年2月1日 到2023年7月3日 我们需要先算2021年剩下的天数 即:从2月1日到12月31日的天数,之后我们就到了2022年,再从2022年到2023年这是一整年,不需要特别算,之后我们就到了2023年,此时我们需要从2023年1月1日开始算到7月3日,算到这,我们的天数就算是算完了,是不是很简单。
    看到上面的例子,你是不是对 y1 +1 和 y2-1 有了一个初步理解,其实此处的 y1+1就相当于2022 ,而 y2 -1 就相当于2022 ,此处也是非常巧合啊正好相等了,而我们的思路也就是前面加黄字体的思路。
  3. 好了,了解了基本思路我们就要上代码了当然这里还是有那么几个点需要注意的:我们直接上代码:
4. #include<stdio.h>
int main()
{
	//在这里我们先把所有月份的天数以数组的形式储存起来,以便后面使用(这里运用了数组思想)
	int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	//接下来我们就要定义我们输入的数据了
	int y1, y2, m1, m2, d1, d2;
	scanf("%d %d %d", &y1, &m1, &d1);
	scanf("%d %d %d", &y2, &m2, &d2);
	//此时我们先算两个日期之间的间隔(虽然这里的顺序和上面我们说的不同,但这就是顺序问题,都一样)
	//即y1+1到y—1之间的天数
	int sum = 0;//这里我们先定义sum为所有天数的和;
	if ((y2 - y1) > 1)
	{
		//这里的(y2 - y1) > 1就非常巧妙:假如两个年间隔超过一年正好将那一整年的天数算出来了,如果不超过一整年,那就是
		//隔了0年或者1年,这两种情况我们在下面再讨论
		
		for (int i = y1 + 1; i <= y2 - 1; i++)//这里我们写了一个循环,将y1+1到y2-1的年份遍历一遍
		{
			if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
			{
				//在这里我们就要挨个判断该年是否为闰年了,如果是,那就将sum加366,否则那就加365
				sum += 366;
			}
			else {
				sum += 365;

			}
		}
	}//经过上面的歩奏,我们已经将间隔算完了,下面就是算两头了;上面我们不是遗留下了一个问题吗,就是间隔了0年或者1年
	//我们分析:假如我们间隔了0年那就是在同一年里算天数,那是不是只用算月份就行了,如果间隔了1年那就是在前后年里求天数
	//这时,我们要将前一年剩下的和后一年已经过完的天数加上就行了。这里我们先考虑0(即:y2-y1=0)
	if (y2 == y1)
	{
		//再判断一次闰年,只不过这次我们判断的目的是:为了确定2月的天数
		if (y1 % 4 == 0 && y1 % 100 != 0 || y1 % 400 == 0)
		{
			//如果是那就将arr[2]=29;
			arr[2] = 29;
		}
		//如果不是那可以不变
		for (int i = m1 + 1; i <= m2 - 1; i++)
		{
			//这里的思想和算年份时的分段思想是一样的,可以深刻感悟一下
			sum += arr[i];

		}
		sum += (arr[m1] - d1) + d2;
		//这里算天数的思想可以好好感悟一下

	}
	//这里我们及时将二月变回去
	arr[2] = 28;
	//在这里就剩一种情况了
	if (y1 != y2)
	{
		if (y1 % 4 == 0 && y1 % 100 != 0 || y1 % 400 == 0)
		{
			arr[2] = 29;
		}
		//这里从m1+1月到12月进行遍历,算出头年内剩下的天数
		for (int i = m1 + 1; i <= 12; i++)
		{
			sum += arr[i];
		}
		//这里别忘了加头月剩下的那几天
		sum += arr[m1] - d1;
		//及时置二月为28天
		arr[2] = 28;
		if (y2 % 4 == 0 && y2 % 100 != 0 || y2 % 400 == 0)
		{
			arr[2] = 29;
		}
		//这里我们就要算尾年内已经过完的天数了
		for (int i = 1; i <= m2 - 1; i++)
		{
			sum += arr[i];
		}
		//这里也不要忘记加上剩下的几天
		sum += d2;
	}
	printf("You have lived %d days.", sum);
	//其实上述代码可以看成:无论两个日期间隔了多少,我们都先将他们的间隔算出来,此时间隔算出来后,是不是就只用算头一年内剩下
	//的天数再加上最后一年内已经过完的天数,况且两年之间的天数sum我们已经加进去了,再加上这两个,这样不就求出了所有天数了吗。
	return 0;
}`

相信对于上面的代码以及注释,你们一定能够看懂,当然还有一种二维数组的方法,只是数组变了,思路都差不多,感兴趣的可以搜索一下,感谢大家的阅读。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值