(注:本文所展示代碼均為本人所寫,不一定為最優)
?
我們首先用純邏輯和手動計算來拆解日期模擬題,再來代碼實現,看看這些問題的底層思路怎么玩明白~
?一、基礎日期計算:直接算“過幾天是哪天”
即進位的思路:
日期模擬進位,核心是低位(日)累計滿當月天數,就向高位(月)進 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,直到所有用例完成 。