top1编程
← 返回题目
题解

输出月历

1 条题解

  • 0
    @ 2026-8-4 16:08:45

    解题思路

    要输出 2020 年某月的月历。先要知道每月 1 号是星期几:2020 年 1 月 1 日是星期三,往后每过一个月,1 号的星期就往后推"上个月的天数 % 7"天。

    输出格式:第一行是星期日到星期六的字母(S M T W T F S),每个字母占 5 位;日期按每格 5 位左对齐打印,1 号前面空出对应星期数的格子,满 7 个换一行。

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int m;
        cin >> m;
        // 2020年是闰年,2月29天
        int days[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
        int first[13];   // 每月1号是星期几(0=星期日 ... 6=星期六)
        first[1] = 3;    // 2020年1月1日是星期三
        for (int i = 2; i <= 12; i++) first[i] = (first[i-1] + days[i-1]) % 7;
    
        cout << "S    M    T    W    T    F    S" << endl;
        // 1号前面空几列
        for (int col = 0; col < first[m]; col++) cout << "     ";
        int d = 1;
        while (d <= days[m]) {
            cout << d;
            // 每格占5位(数字后补空格)
            if (d < 10) cout << "    "; else cout << "   ";
            // 到星期六换行,或最后一天换行
            if ((first[m] + d - 1) % 7 == 6 || d == days[m]) cout << endl;
            d++;
        }
        return 0;
    }
    

    复杂度分析

    只循环 31 天,时间复杂度 O(1),额外空间复杂度 O(1)。

    • 1