1 条题解
-
0
思路与算法
把数字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)。题面未给出错误整数位数上界,数据说明不把任意选取的长文本误称为原题最大范围。
易错点
- 星期一对应Monday,星期日对应Sunday,不能按从0开始的数组位置直接套用。
- Wednesday和Thursday的拼写、英文首字母大写,以及错误提示的空格和感叹号必须一致。
- 每个case后必须break,避免贯穿输出多个名称。
- 0、负数和大于7的整数都进入错误分支;错误数字不应先进行可能溢出的int转换。
- 本批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