当前位置: 首页 > backend >正文

C++刷题:日期模拟(1)

(注:本文所展示代码均为本人所写,不一定为最优)

 

我们首先用纯逻辑和手动计算来拆解日期模拟题,再来代码实现,看看这些问题的底层思路怎么玩明白~

 一、基础日期计算:直接算“过几天是哪天”

即进位的思路:

日期模拟进位,核心是低位(日)累计满当月天数,就向高位(月)进 1,同时低位重置;月累计满 12,就向年进 1,月重置 ,类似十进制“个位满 10 进 1 到十位”,且要结合大小月、闰年(影响 2 月天数,即 2 月满 28 或 29 天才进位 )调整规则 。

题目举例:2024年7月20日过45天是哪天?

1. 先看当月剩余天数:7月有31天,20日到31日还剩31-20=11天;

2. 剩下的天数往后推:45-11=34天,即进入8月;

3. 8月有31天,34天超过31天,所以8月31天后还剩34-31=3天,进入9月;

4. 结果:2024年9月3日。

代码实现如下:

 

 

二、闰年与特殊月份:必须记牢规则

闰年规则(划重点!)

- 能被4整除但不能被100整除的年份是闰年(如2020年);

- 能被400整除的年份也是闰年(如2000年)

 - 平年2月28天,闰年2月29天,其他月份天数固定(1、3、5、7、8、10、12月31天,4、6、9、11月30天)。

代码实现判断闰年:

以上这两个函数均用于判断闰年,核心逻辑一致(满足能被 4 整除但不能被 100 整除,或能被 400 整除 ),差异在于:

 leap_year1 :用  if - else  分支,先判断条件,再分别返回  true / false  ,逻辑清晰直观。

leap_year2 :直接通过条件表达式返回结果,更简洁紧凑,代码量少 。(推荐算法题优先考虑)

 

题目举例:2024年2月1日到2024年5月1日共有多少天?

计算步骤:

- 2024年是闰年,2月有29天,2月1日到2月29日:29天;

- 3月31天,4月30天;

- 总天数:29+31+30=90天。

 

三.练习题

1.计算一年的第几天
https://www.nowcoder.com/practice/769d45d455fe40b385ba32f97e7bcded?tpId=37&&tqId=21296&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking

 解题思路:

1. 先判断年份是否为闰年,确定2月天数。

2. 依据月份,累加之前月份的天数(1、3、5等大月31天,4、6等小月30天,2月按平/闰年算)。

3. 最后加上当月的天数,总和即为该日期是当年第几天。

参考代码如下:

 

2.日期差值

https://www.nowcoder.com/practice/ccb7383c76fc48d2bbc27a2a6319631c?tpId=62&&tqId=29468&rp=1&ru=

 参考代码

 以上代码:

1.  leapyear 函数:判断年份是否为闰年,依据能被4整除但非100整除,或能被400整除的规则 。

2.  cntday 函数:先根据平闰年设置2月天数,通过循环累加当前日期前所有月份天数,再加上当日天数;若跨多年,循环累加之前每年的天数(闰年366天,平年365天 ),得到日期距起始的总天数。

3.  main 函数:拆分输入日期的年、月、日,调用 cntday 分别算两日期总天数,用绝对值差加1(包含两端日期 ),输出结果,处理多组输入。

 

3.打印日期

https://www.nowcoder.com/practice/b1f7a77416194fd3abd63737cdfcf82b?tpId=69&&tqId=29669&rp=1&ru=/activity/oj&qru=/ta/hust-kaoyan/question-ranking

 参考代码:

 以上 C++ 代码的解题思路如下:

1. 闰年判断: leap_year  函数依据规则(能被 4 整除但非 100 整除,或能被 400 整除 )判断年份是否为闰年,用于确定 2 月天数。

2. 数据初始化: main  函数里,定义年、日、月变量, arr  数组存储各月天数(下标对应月份,0 号元素无用 )。

3. 处理输入与日期转换: while  循环读取年和天数,先根据闰年设置 2 月天数。通过循环,用总天数依次减去各月天数,同时月份递增,直到剩余天数小于当前月天数,确定最终月份。

4. 格式化输出:依据月份和日期的位数(是否小于 10 ),分情况格式化输出完整日期,如补前导 0 ,让输出符合常见日期显示格式 。

 

4.累加日期

https://www.nowcoder.com/practice/eebb2983b7bf40408a1360efb33f9e5d?tpId=40&&tqId=31013&rp=1&ru=/activity/oj&qru=/ta/kaoyan/question-ranking

 参考代码

 以上代码用于日期累加,解题思路如下:

1. 闰年判断: leap_year  函数按规则(能被4整除且非100整除,或能被400整除 )判断闰年,影响2月天数。

2. 输入处理:读取测试用例数  n  ,再依次读入年、月、日、待加天数。

3. 日期推算:先根据闰年设置2月天数,将待加天数与当日天数合并。通过循环,用总天数减当前月天数、递增月份,若超12月则跨年并重置月份,同时更新闰年状态。

4. 格式化输出:按月份和日期的位数补前导0,输出推算后的日期,处理完一组数据  n  减1,直到所有用例完成 。

http://www.xdnf.cn/news/12661.html

相关文章:

  • 使用 C++/OpenCV 创建动态流星雨特效 (实时动画)
  • Linux 系统中的算法技巧与性能优化
  • 浅谈 React Hooks
  • 行为型设计模式之Interpreter(解释器)
  • 低功耗MQTT物联网架构Java实现揭秘
  • 八、【ESP32开发全栈指南:UDP客户端】
  • NLP学习路线图(三十):微调策略
  • Python图论与网络可视化——网络结构、路径分析与生物代谢通路
  • 【Linux shell】shell中的变量——构建脚本逻辑的基石
  • 水利工程流速监测中的雷达流速仪
  • FreeRTOS事件组-笔记
  • 33、原子操作
  • C++常用的自动化测试库
  • PostgreSQL数据类型使用
  • 【生活】程序员防猝si指南
  • java_网络服务相关_gateway_nacos_feign区别联系
  • JAVA-springboot log日志
  • 打卡46天
  • DDPM优化目标公式推导
  • JAVA国际版二手交易系统手机回收好物回收发布闲置商品系统源码支持APP+H5
  • 每日算法刷题Day25 6.7:leetcode二分答案3道题,用时1h40min(遇到两道动态规划和贪心时间较长)
  • 【Go语言基础【15】】数组:固定长度的连续存储结构
  • FreeRTOS任务之深入篇
  • ps蒙版介绍
  • Mac软件卸载指南,简单易懂!
  • MySQL复杂SQL(多表联查/子查询)详细讲解
  • 程序代码篇---Python串口
  • Vibe Coding AI编程
  • 安全访问家中 Linux 服务器的远程方案 —— 专为单用户场景设计
  • nginx日志的一点理解