#include <stdio.h>

// 判断是否为闰年（用于计算2月天数）
int isLeapYear(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        return 1;  // 是闰年
    } else {
        return 0;  // 不是闰年
    }
}

// 获取月份的天数
int getDaysInMonth(int year, int month) {
    switch (month) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            return 31;
        case 4: case 6: case 9: case 11:
            return 30;
        case 2:
            return isLeapYear(year) ? 29 : 28;  // 闰年29天，平年28天
        default:
            return 0;  // 无效月份
    }
}

// 计算该月第一天是星期几（简化版：假设2000年1月1日是星期六，仅作示例）
int getFirstDayOfMonth(int year, int month) {
    // 实际应用中需用更精确的公式，此处简化计算
    int totalDays = 0;
    // 累加从2000年到目标年份前一年的总天数
    for (int y = 2000; y < year; y++) {
        totalDays += isLeapYear(y) ? 366 : 365;
    }
    // 累加目标年份到目标月份前一个月的总天数
    for (int m = 1; m < month; m++) {
        totalDays += getDaysInMonth(year, m);
    }
    // 2000年1月1日是星期六（6），计算目标月第一天的星期（0=日，1=一，…，6=六）
    return (totalDays + 6) % 7;
}

int main() {
    int year, month;
    printf("请输入年份和月份（用空格分隔）：");
    scanf("%d %d", &year, &month);

    int days = getDaysInMonth(year, month);
    int firstDay = getFirstDayOfMonth(year, month);  // 0=日，1=一，…，6=六

    // 打印星期标题
    printf("  日  一  二  三  四  五  六\n");

    int date = 1;  // 日期从1开始
    // 外层循环：控制每周（最多6行）
    for (int week = 0; week < 6; week++) {
        // 内层循环：控制每周的7天
        for (int day = 0; day < 7; day++) {
            // 第一周：日期未开始时打印空格
            if (week == 0 && day < firstDay) {
                printf("    ");  // 4个空格占位
            } else if (date > days) {
                // 日期已结束，跳出所有循环
                break;
            } else {
                // 打印日期（占4位，右对齐）
                printf("%4d", date);
                date++;
            }
        }
        printf("\n");  // 每周结束换行
        if (date > days) {
            break;  // 日期打印完，提前结束外层循环
        }
    }

    return 0;
}
