牛客网:HJ73 计算日期到天数转换 (C++实现)

在这里插入图片描述

在这里插入图片描述

题目部分:

在这里插入图片描述

解题思路:

方案一:

写一个类似我在类和对象篇章日期类实现中根据年和月可以推理出天数的函数。具体实现方法其实就是先定义一个月份的数组,将1到12月份的天数提前写进去,除了二月需要特殊处理以外(平年的二月28天,润年的二月29天),剩下的月份完全可以直接返回天数。

若是还没有理解的xdm可以点击下面这个链接跳转到我之前写的类和对象博客中,这里面有详细讲解。

C++类和对象讲解完整版

在这里插入图片描述

有了上面这个能根据年份和月份推理出具体天数的函数以后,接下来操作就能简单粗暴了,直接根据年份和月份推理出的天数进行遍历迭代相加即可。

方案一演示代码讲解如下:

在这里插入图片描述

附1:方案一源码提取:

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>

using namespace std;

int GetMonthDay(int year, int month) // 根据年份和月份推理出天数的函数
{
	// 1到12月份的天数,记得数组下标是从0开始的
	static int monthDayArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 

	int day = monthDayArray[month];

	if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) // 判断是否是润年
	{
		day += 1; // 平年二月28天,润年二月29天
	}

	return day;
}

int main()
{
	int year, month, day;
	cin >> year >> month >> day;

	int n = 0; // 最终算出结果要返回的天数,初始为0

	// 开始根据年份和月份进行遍历迭代天数相加
	for (int i = 1; i < month; ++i)
	{
		n += GetMonthDay(year, i);
	}

	n += day; // 前面获得的结果是当前月以前的天数,所以还要把当前月的天数加上

	cout << n << endl;

	return 0;
}

方案二:

方案二是基于方案一的基础上进行优化改进,方案一是既然我们知道1到12月份的具体天数将其放入数组进行操作,那么我们也可以知道一月到二月总共多少天,一月到三月总共多少天…即几个月份之和的天数我们也是了若指掌的,当然也可以将其定义成数组进行接下来方案二的操作。

一月是31天,一月加上二月是59天(平年),一月加上二月再加上三月就是90天…以此类推,我们就可以知道到几月份之前的月份天数之和是多少了,然后再直接加上当前月份的天数,就可以直接算出来当前月份是这一年的第几天了。当然,依旧还是不要忘记对二月进行特殊的处理。

方案二演示代码讲解如下:

在这里插入图片描述

附2:方案二源码提取:

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>

using namespace std;

int main()
{
	int year, month, day;
	cin >> year >> month >> day;

	// 1到2月31天,1到3月59天,以此类推,记得数组下标是从0开始的
	int monthDays1_N[13] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };

	int n = 0; // 算天数的最终结果

	n += monthDays1_N[month - 1]; // 算出当前月之前的天数和

	n += day; // 加上当前月就能算出是这年的第几天了

	// 当然记得还是不要忘记对平年和润年的二月进行特殊判断处理
	if (month > 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
	{
		n += 1;
	}

	cout << n << endl;

	return 0;
}

测试结果:

方案一:

在这里插入图片描述

方案二:

在这里插入图片描述

不出意外的话肯定是狠狠拿下!

在这里插入图片描述

备注:

楼主不才,不喜勿喷,若有错误或需要改进的地方,非常感谢你的指出,我会积极学习采纳。谢谢家人们一直以来的支持和鼓励,我会继续努力再接再励创作出更多优质的文章来回报家人们的。编程爱好的xdm,若有编程学习方面的问题可以私信我一同探讨(我尽力帮),毕竟“众人拾柴火焰高”,大家一起交流学习,共同进步!

在这里插入图片描述

2023年3月6日

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

曜摆摆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值