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

发布于:2025-06-08 ⋅ 阅读:(14) ⋅ 点赞:(0)

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

 

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

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

即进位的思路:

日期模拟进位,核心是低位(日)累计满当月天数,就向高位(月)进 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,直到所有用例完成 。