首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

杭電OJ 2005 題解:日期轉年內天數——閏年判斷與累加邏輯

     編輯:關於C

題目描述

輸入日期 yyyy/mm/dd(多組,EOF 結束),輸出該日期是當年的第幾天。

核心邏輯:閏年判斷與月份累加


#include 

int main(void) {
    int y, m, d;
    // 每月天數表(非閏年)
    int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    while (scanf("%d/%d/%d", &y, &m, &d) == 3) {
        int sum = 0;
        // 累加前 m-1 月天數
        for (int i = 0; i < m - 1; i++) {
            sum += days[i];
        }
        // 閏年且月份 > 2,加 1 天
        if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
            if (m > 2) sum++;
        }
        printf("%d\n", sum + d);
    }
    return 0;
}

關鍵點解析

  1. 閏年規則:(年份 % 4 == 0 && 年份 % 100 != 0) || 年份 % 400 == 0。
  2. 只影響 2 月後:閏日在 2 月 29 日,故 m > 2 時才補一天。
  3. 輸入格式:scanf("%d/%d/%d") 直接匹配斜槓分隔符,簡潔健壯。
  4. 數組索引:days[i] 對應第 i+1 月,循環 i < m-1 累加前 m-1 月。

測試用例

輸入輸出說明
2000/01/011閏年首日
2000/02/2960閏日
2000/03/0161閏年3月1日
2001/03/0160平年3月1日
2000/12/31366閏年尾日
2001/12/31365平年尾日

常見錯誤避坑

  • 忘記 m > 2 判斷,導致 1-2 月也加一天。
  • 閏年條件寫錯(如漏掉 %400 或 %100 判斷)。
  • 數組下標越界(月份 0 或 13)。
  • 輸入格式不匹配導致 scanf 失敗死循環(建議檢查返回值 == 3)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved