首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

CCF 節日日期計算題(C++)僅得 80 分的原因分析與修正

     編輯:程式設計綜合問答

題目回顧

給定月份 a、第幾個星期 b、星期幾 c(1=周一 … 7=周日)以及年份範圍 y1, y2(1850~2050),輸出每年該月份第 b 個星期 c 的日期(格式 yyyy/mm/dd),不存在則輸出 none。已知 1850-01-01 是星期二。

原代碼邏輯與失分點

原代碼通過計算從 1850 年到目標年份首日經過的總天數 s,再推算目標月份首日星期,最後遍歷該月天數尋找第 b 個目標星期。但在計算 1850-01-01 星期時使用了:

int week = (s - 1) % 7 + 3;

當 s = 0(即 1850 年 1 月)時,(s-1) 為 -1。C++ 標準未規定負數取模的具體行為,不同編譯器結果不同(如 VC 中 -1 % 7 == -1),導致 1850-01-01 被誤判為周四,進而影響後續所有年份計算。

修正方案

將基準日星期計算改為避免負數取模:

int week = (s + 1) % 7 + 1;  // 1850-01-01 為周二(2),驗證:s=0 → (0+1)%7+1=2

或先將 s 加一個 7 的倍數再取模,確保非負。

其他注意事項

  • 閏年判斷邏輯正確:year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)。
  • 輸出格式需補零,使用 setw(2) 和 setfill('0')。
  • 遍歷月份天數時,若未找到第 b 個目標星期,輸出 none。

總結

核心失分點在於負數取模的未定義行為。修正基準星期計算後,配合正確的閏年、月份天數邏輯,即可獲得滿分。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved