1 条题解

  • 0
    @ 2026-10-26 9:53:13

    思路与算法

    把数字1到7视为七个互斥的分支,分别输出Monday至Sunday。使用switch语句,每个case输出后break,default统一输出input error!。本题只做对应关系查询,不计算若干天后的日期。

    题面没有指定错误数字的机器整数范围。参考程序先读取十进制文本,检查数字字符并去掉可选正号与前导零;只有非负且规范化后为单个1至7的值才进入对应分支,其他数字进入default。这样无需把很大的错误数字转换到int,也不会因溢出误入合法分支。字符串处理只是输入兼容,核心是七路选择。

    正确性说明

    对1至7,每个数都且仅都匹配一个case,所输出英文名称与原题表格逐项一致,break保证不会继续执行后面的分支。对其他整数,其值既不属于七个合法星期,也不会规范化为单个1至7,故day保持0或落在其他值,执行default并输出指定错误提示。

    可选正号和前导零不改变整数的值,负整数不可能是1至7。扫描全部字符并仅从规范化的单字符提取数字,不做机器整数转换,所以该分类对可完整读入的十进制整数都成立。由此所有合法星期与错误整数分别得到要求的输出。

    复杂度

    令L为输入整数的十进制文本长度。读入、检查字符、去除前导零合计O(L)时间,switch初始化和选择均O(1),总时间O(L)。保存输入文本需要O(L)空间,其余变量和固定英文名称为O(1)。题面未给出错误整数位数上界,数据说明不把任意选取的长文本误称为原题最大范围。

    易错点

    1. 星期一对应Monday,星期日对应Sunday,不能按从0开始的数组位置直接套用。
    2. Wednesday和Thursday的拼写、英文首字母大写,以及错误提示的空格和感叹号必须一致。
    3. 每个case后必须break,避免贯穿输出多个名称。
    4. 0、负数和大于7的整数都进入错误分支;错误数字不应先进行可能溢出的int转换。
    5. 本批10点覆盖七个正确分支、0、负数和8;首点是原站公开样例。另做带符号、前导零和长整数的独立程序交叉检查,不计入原生主验收点。

    参考代码(C++11)

    #include <iostream>
    #include <string>
    using namespace std;
    int main() {
        string token;
        if (!(cin >> token))
            return 0;
        size_t pos = 0;
        bool negative = false;
        if (token[pos] == '+' || token[pos] == '-') {
            negative = token[pos] == '-';
            ++pos;
        }
        size_t digits = pos;
        bool valid = digits < token.size();
        for (size_t i = digits; i < token.size(); ++i) {
            if (token[i] < '0' || token[i] > '9')
                valid = false;
        }
        while (pos < token.size() && token[pos] == '0')
            ++pos;
        int day = 0;
        if (valid && !negative && token.size() - pos == 1)
            day = token[pos] - '0';
        switch (day) {
        case 1:
            cout << "Monday\n";
            break;
        case 2:
            cout << "Tuesday\n";
            break;
        case 3:
            cout << "Wednesday\n";
            break;
        case 4:
            cout << "Thursday\n";
            break;
        case 5:
            cout << "Friday\n";
            break;
        case 6:
            cout << "Saturday\n";
            break;
        case 7:
            cout << "Sunday\n";
            break;
        default:
            cout << "input error!\n";
        }
    }
    
    • 1

    信息

    ID
    1690
    时间
    1000ms
    内存
    64MiB
    难度
    入门
    标签
    递交数
    1
    已通过
    1
    上传者