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,直到所有用例完成 。

相关推荐
zh_xuan2 小时前
c++ 单例模式
开发语言·c++·单例模式
恰薯条的屑海鸥4 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
int型码农4 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
利刃大大4 小时前
【在线五子棋对战】二、websocket && 服务器搭建
服务器·c++·websocket·网络协议·项目
UFIT4 小时前
NoSQL之redis哨兵
java·前端·算法
SHERlocked935 小时前
CPP 从 0 到 1 完成一个支持 future/promise 的 Windows 异步串口通信库
c++·算法·promise
怀旧,5 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
积极向上的向日葵5 小时前
有效的括号题解
数据结构·算法·
GIS小天5 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票