【刷题日志】牛客 HJ73 计算日期到天数转换

2023-12-04 20:20

本文主要是介绍【刷题日志】牛客 HJ73 计算日期到天数转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

计算日期到天数转换

  • 阅读题目
  • 解题方案 及 解题思路
  • 方法一 . 手撕日期类
  • 方法二 . 分别直接算出平年和闰年每个月的时间 并对应下标存入数组中,判断该年份为平年还是闰年,再 for循环依次求和
      • 优化:也不用分别算出平年和闰年的每个月的时间,闰年就比平年多一天,所以直接算出平年各月的天数,判断是否为闰年,是就在原基础上天数再 +1 就行。
  • 方法三 . 直接按平年,算好每个月份已累积到的天数(累积到的都是前面的月份完整天数的总和),再加上该月已过的天数,就是这一年中的第几天了



阅读题目

在这里插入图片描述



解题方案 及 解题思路

方法一 . 手撕日期类

我只把日期类中真正派上用场的成员函数写出来

思路从 int TheDayOfYear() 开始看起,顺着 //注释 思路看

//方案一 手撕一个日期类出来
#include <iostream>
using namespace std;
class Date {public:Date(int year = 0, int month = 0, int day = 0) {_year = year;_month = month;_day = day;}bool operator>(const Date& d) const {if (this->_year > d._year)return true;else if (this->_year == d._year && this->_month > d._month)return true;else if (this->_year == d._year && this->_month == d._month &&this->_day > d._day)return true;elsereturn false;}bool operator==(const Date& d) const {if (this->_year == d._year&& this->_month == d._month&& this->_day == d._day)return true;elsereturn false;}bool operator!=(const Date& d) const {return !(*this == d);}bool operator<(const Date& d) const {return !(*this > d || *this == d);}Date& operator-=(int day) {if (day < 0) {*this += -day;return *this;}_day -= day;while (_day <= 0) {_month--;if (_month == 0) {_month = 12;_year--;}_day += GetMonthDays(_year, _month);}return *this;}Date& operator+=(int day) {if (day < 0) {*this -= -day;return *this;}// 对日期进行+=,直到++min到与max时间相同时,则结束_day += day;                   while (_day > GetMonthDays(_year, _month)) {    _day -= GetMonthDays(_year, _month);_month++;if (_month == 13) {_month = 1;_year++;}}return *this;}int GetMonthDays(int year, int month) {static int monthDays[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))return 29;elsereturn monthDays[month];}Date& operator++() {*this += 1;     //再调用 `+=`自定义类型 重载运算符return *this;}int operator-(const Date& d) const {Date max = *this;Date min = d;int flag = 1;int cnt = 0;if (*this < d) {   //调用 bool`<` 自定义类型 重载判断运算符max = d;min = *this;flag = -1;}// 直到加到日期重合为止while (min != max) {   //调用 bool`!=`自定义类型 重载判断运算符++cnt;     //内置类型的 ++++min;     //调用 `++`自定义类型 重载运算符}return cnt * flag;}int TheDayOfYear() {return (*this - Date(_year, 1, 1)) + 1;  //调用 `-`重载运算符}private:int _year;int _month;int _day;
};int main() {int year,month,day;while(cin>>year>>month>>day){Date d(year,month,day);cout<<d.TheDayOfYear()<<endl;}
}


方法二 . 分别直接算出平年和闰年每个月的时间 并对应下标存入数组中,判断该年份为平年还是闰年,再 for循环依次求和

优化:也不用分别算出平年和闰年的每个月的时间,闰年就比平年多一天,所以直接算出平年各月的天数,判断是否为闰年,是就在原基础上天数再 +1 就行。

#include <iostream>
using namespace std;int main() {//平年int ar[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int year, month, day;int cnt = 0;while (cin >> year >> month >> day) {for (int i = 1; i < month; i++) {cnt += ar[i];}}//并不是所有二月都要+1的,要判断是否经过 二月的最后一天if (month > 2 && ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))) {cnt++;}cout << cnt + day << endl;
}


方法三 . 直接按平年,算好每个月份已累积到的天数(累积到的都是前面的月份完整天数的总和),再加上该月已过的天数,就是这一年中的第几天了

#include <iostream>
using namespace std;int main() {//平年每月//int ar[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//平年每个月的累积int ar[13] = {0,31,59,90,120,151,181,212,243,273,304,334};int year, month, day;cin>>year>>month>>day;//并不是所有二月都要+1的,要判断是否经过 二月的最后一天if (month > 2 && ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))) {cout << ar[month-1]+day+1 << endl;}else {cout << ar[month-1]+day << endl;}    
}

这篇关于【刷题日志】牛客 HJ73 计算日期到天数转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/454790

相关文章

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

springboot日期格式化全局LocalDateTime详解

《springboot日期格式化全局LocalDateTime详解》文章主要分析了SpringBoot中ObjectMapper对象的序列化和反序列化过程,并具体探讨了日期格式化问题,通过分析Spri... 目录分析ObjectMapper与jsonSerializer结论自定义日期格式(全局)扩展利用配置

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

开启mysql的binlog日志步骤详解

《开启mysql的binlog日志步骤详解》:本文主要介绍MySQL5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下... 目录1.查看是否开启bin_log2.数据库会把日志放进logs目录中3.查看log日志总结 mysql版本5.71.查看