1 条题解
-
0
月份天数
一个自然的想法,和它的整理
输入年、月,输出这个月有多少天。第一反应可能是给 12 个月各写一个 if——能做,但 12 个分支太啰嗦。稍微整理一下就会发现,12 个月其实只有三类:
- 31 天:1、3、5、7、8、10、12 月
- 30 天:4、6、9、11 月
- 2 月:平年 28 天,闰年 29 天
突破口:分类讨论 + 复用已有结论
第三类是本题真正的考点。2 月的天数取决于闰年,而闰年的判断规则正是上一题的内容——四年一闰,百年不闰,四百年再闰:
(y % 4 == 0 && y % 100 != 0) || y % 400 == 0于是整个程序就是"三段分类 + 一次闰年判断"的组合,没有任何新知识,考的是把已有规则组织起来的能力。
代码实现
#include <stdio.h> int main() { int y, m; scanf("%d%d", &y, &m); if (m == 4 || m == 6 || m == 9 || m == 11) printf("30"); else if (m == 2) { if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) printf("29"); else printf("28"); } else printf("31"); return 0; }用样例验证:1926 年 8 月,8 不在 30 天列表、不是 2 月 → 31 ✓;2000 年 2 月,2000 能被 400 整除是闰年 → 29 ✓。
容易出错的细节
- 31 天的月份列表容易抄错:7、8 两个月连续是大月,1 月也要在列表里。可以按口诀"一三五七八十腊"记(腊 = 12 月)。
- 闰年规则必须完整:只判断
y % 4 == 0的话,1900 2这组数据就会输出 29 而不是 28。 - 判断顺序上先排除 30 天和 2 月,剩下的自然全是 31 天——比逐月枚举少写很多分支。
复杂度
时间与空间复杂度均为 O(1)。
这题的本质:分类讨论 + 复用已有结论。闰年判断不是新知识,而是上一题的结论直接搬过来用——做题时学会识别"这步我已经会了",是提速的关键。
信息
- ID
- 518
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 3
- 已通过
- 3
- 上传者