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

相关推荐
QT 小鲜肉1 分钟前
【个人成长笔记】Qt Creator快捷键终极指南:从入门到精通
开发语言·c++·笔记·qt·学习·学习方法
CHANG_THE_WORLD13 分钟前
switch语句在汇编层面的几种优化方式 ,为什么能进行优化
汇编·算法·switch·汇编分析·switch case·switch case 汇编·switch case 语句
勇闯逆流河14 分钟前
【C++】用红黑树封装map与set
java·开发语言·数据结构·c++
实心儿儿14 分钟前
C++——内存管理
c++
山,离天三尺三14 分钟前
深度拷贝详解
开发语言·c++·算法
Blossom.11822 分钟前
把AI“撒”进农田:基于极值量化与状态机的1KB边缘灌溉决策树
人工智能·python·深度学习·算法·目标检测·决策树·机器学习
一只鱼^_40 分钟前
第 167 场双周赛 / 第 471 场周赛
数据结构·b树·算法·leetcode·深度优先·近邻算法·迭代加深
我狸才不是赔钱货42 分钟前
容器:软件世界的标准集装箱
linux·运维·c++·docker·容器
云知谷1 小时前
【嵌入式基本功】单片机嵌入式学习路线
linux·c语言·c++·单片机·嵌入式硬件
被制作时长两年半的个人练习生1 小时前
近期的笔试和面试的复盘
算法·面试·职场和发展·算子