题解 | #计算一年中的第几天#
计算一年中的第几天
https://www.nowcoder.com/practice/178aa3dafb144bb8b0445edb5e9b812a
一、核心思路
1.确定二月天数
根据闰年规则(能被4整除且不能被100整除,或者能被400整除)决定二月是28天(平年)还是29天(闰年)。
2.累加整月天数
用数组存储每个月的天数(1月到12月),将前 month-1 个月的天数累加起来。
3.加上当月天数
最后加上输入的 day,即为当年的第几天。
二、关键注意事项
-
闰年判断公式: (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
-
数组索引:月份数组下标0对应1月,所以前 month-1 个月对应 mon[0] 到 mon[month-2]。
-
多组输入:如果题目要求处理多组数据(如 while(scanf(...)!=EOF)),必须每次循环重置累加变量,否则天数会错误累加。
-
二月天数动态修改:每次判断闰年后,将 mon[1] 重新赋值为28或29,避免上次修改影响下一次计算。
三、代码结构(C语言)
c #include <stdio.h>
int main() { int year, month, day; int mon[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
while (scanf("%d %d %d", &year, &month, &day) != EOF) {
int count = 0; // ① 每次重置累加器
// ② 闰年判断,调整二月天数
if ((year%4==0 && year%100!=0) || (year%400==0))
mon[1] = 29;
else
mon[1] = 28;
// ③ 累加前 month-1 个月的天数
for (int i = 0; i < month - 1; i++)
count += mon[i];
// ④ 加上当月天数
count += day;
printf("%d\n", count);
}
return 0;
}
四、测试用例
输入(年 月 日) 预期输出 说明
1990 9 20 ,263 平年,计算无误
2000 3 1 ,61 闰年(2月29天)
2023 1 1 ,1 第一天
2023 12 31 ,365 最后一天
五、常见错误与避坑
-
忘记重置 count → 多组输入时结果累加。
-
月份数组未恢复 → 若不在循环内重置 mon[1],前一个闰年的29天会影响到后续平年计算。
-
数组越界 → month-1 最小为0(1月时循环0次),最大为11(12月时循环11次),合法。
-
逻辑运算符优先级 → 建议显式加括号:(year%4==0 && year%100!=0) || (year%400==0)。
查看8道真题和解析