計算目標月 1 號是星期幾,再按行打印日期網格。關鍵步驟:
#include
int is_leap(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
int main() {
int year, month;
printf("請輸入年份:"); scanf("%d", &year);
printf("請輸入月份:"); scanf("%d", &month);
int days_in_month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
if (is_leap(year)) days_in_month[1] = 29;
// 1. 計算 1900-01-01 到 year-month-01 的總天數
int total_days = 0;
for (int y = 1900; y < year; y++)
total_days += is_leap(y) ? 366 : 365;
for (int m = 1; m < month; m++)
total_days += days_in_month[m-1];
// 2. 1 號星期幾 (1900-01-01 是星期一, 這裡約定 0=日, 1=一... 需調整)
// 假設 1900-01-01 是星期一(1), 則 weekday = (total_days + 1) % 7; 0=日
int weekday = (total_days + 1) % 7;
// 3. 打印表頭
printf("日\t一\t二\t三\t四\t五\t六\n");
// 4. 打印前導空格
for (int i = 0; i < weekday; i++) printf("\t");
// 5. 打印日期
for (int d = 1; d <= days_in_month[month-1]; d++) {
printf("%d\t", d);
if ((weekday + d) % 7 == 0) printf("\n");
}
printf("\n");
return 0;
}
輸入:2024 2 輸出: 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29