1. 项目概述:PTA选择结构计算天数
这个题目来自程序设计初学者常见的练习场景,主要考察选择结构的灵活运用。题目要求编写一个程序,根据用户输入的年份和月份,计算该月份包含的天数。看似简单的问题背后,其实涵盖了闰年判断、月份天数差异、边界条件处理等多个编程核心知识点。
我在ACM校队担任算法教练时,发现至少有30%的初学者在这个题目上会犯各种边界错误。比如忘记处理2月的特殊情况,或者对闰年判断条件理解不准确。本文将结合PTA平台的判题特点,详细拆解这个经典问题的解决思路,并分享几个实测有效的调试技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法设计
2.1 闰年判断规则解析
闰年判断是这个问题的第一个关键点。常见的错误是只考虑"能被4整除"这一条件。实际上完整的闰年规则包含两个层次:
- 普通闰年:能被4整除但不能被100整除
- 世纪闰年:能被400整除
用代码表示应为:
c复制if((year%4==0 && year%100!=0) || year%400==0){
// 是闰年
}
注意:PTA平台对1900年等特殊年份的测试用例很常见,必须严格遵循上述判断条件
2.2 月份天数处理方案
月份天数处理有几种常见实现方式:
- switch-case结构:最直观但代码冗长
- 数组映射法:更简洁高效
- 条件判断法:适合初学者理解
推荐使用数组映射法,先定义月份天数数组:
c复制int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
然后根据闰年判断调整2月天数:
c复制if(闰年) days[1] = 29;
3. 完整实现与边界处理
3.1 代码实现示例
c复制#include <stdio.h>
int main() {
int year, month;
scanf("%d %d", &year, &month);
int days[] = {31,28,31,30,31,30,31,31,30,31,30,31};
// 闰年判断
if((year%4==0 && year%100!=0) || year%400
