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