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

C語言計算某年某月天數:閏年判斷與兩種實現方式對比

     編輯:關於C語言

題目描述

輸入年份和月份,輸出該月天數。

範例: 2009 6 → 30

閏年判斷規則

**公曆閏年**:(year % 4 == 0 && year % 100 != 0) || year % 400 == 0

  • 2000 閏年 (400 整除)
  • 1900 平年 (100 整除但非 400)
  • 2004 閏年 (4 整除非 100)

方法一:switch 分支(直觀、易維護)

#include 

int main() {
    int y, m;
    scanf("%d %d", &y, &m);
    
    int leap = (y%4==0 && y%100!=0) || y%400==0;
    int days;
    
    switch (m) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            days = 31; break;
        case 4: case 6: case 9: case 11:
            days = 30; break;
        case 2:
            days = leap ? 29 : 28; break;
        default:
            days = -1; // 無效月份
    }
    printf("%d\n", days);
    return 0;
}

方法二:if-else 邏輯(無 switch 場景)

int days_in_month(int y, int m) {
    if (m == 2)
        return ((y%4==0 && y%100!=0) || y%400==0) ? 29 : 28;
    if (m == 4 || m == 6 || m == 9 || m == 11)
        return 30;
    if (m >= 1 && m <= 12)
        return 31;
    return -1;
}

方法三:查表法(最高效、可擴展)

int days_in_month_lut(int y, int m) {
    static const int days[2][13] = {
        {0,31,28,31,30,31,30,31,31,30,31,30,31}, // 平年
        {0,31,29,31,30,31,30,31,31,30,31,30,31}  // 閏年
    };
    if (m < 1 || m > 12) return -1;
    int leap = (y%4==0 && y%100!=0) || y%400==0;
    return days[leap][m];
}

擴展:某年某月某日是當年第幾天

int day_of_year(int y, int m, int d) {
    static const int cum[13] = {0,0,31,59,90,120,151,181,212,243,273,304,334}; // 平年累積
    if (m < 1 || m > 12) return -1;
    int leap = (y%4==0 && y%100!=0) || y%400==0;
    int days = cum[m] + d + (leap && m > 2);
    return days;
}

Java 對比(僅供參考)

// Java 8+
LocalDate.of(year, month, 1).lengthOfMonth(); // 直接得天數

總結

計算月天數核心在 **閏年判斷** 与 **2月特殊處理**。工程推薦 **查表法**:O(1)、無分支、易擴展(如農曆、儒略曆)。掌握三種寫法,能應對從筆試到嵌入式開發的各種約束場景。

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