上海计算机学会2026年月6月赛C++丙组T1 计算天数

📅 2026/6/29 19:33:49
上海计算机学会2026年月6月赛C++丙组T1 计算天数
计算天数题目描述给定一个日期的年份用整数 Y 表示、月用整数 M 表示、日用整数 D 表示请判断 Y 年 M 月是否存在 D 日如果在 Y 年 M 月不存在 D 日则输出 E否则请计算并输出给定的日期是当年的第几天。注意闰年的二月有 29 天。输入格式第一行一个整数表示 Y第二行一个整数表示 M第三行一个整数表示 D输出格式单个整数表示给定日期是当年的第几天如果日期不合法输出 E。数据范围1800≤Y≤28001800 \le Y \le 28001800≤Y≤28001≤M≤121 \le M \le 121≤M≤121≤D≤311 \le D \le 311≤D≤31样例样例1输入2026 2 29输出E说明平年2月不存在29天。样例2输入2020 2 29输出60#includebits/stdc.husingnamespacestd;// 我预先定义好平年每个月的天数下标从1开始dd[0]无意义intdd[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};intmain(){inty,m,d;cinymd;// 第一步判断是否为闰年如果是则将二月天数改为29// 闰年规则能被400整除或者能被4整除但不能被100整除if(y%4000||(y%40y%100!0)){dd[2]29;}// 第二步检查日期是否合法即D是否超过该月应有的最大天数// 如果非法输出E并结束程序if(ddd[m]){coutE;return0;}// 第三步累加当年该日期之前所有月份的天数再加上当前日期D// 注意循环从1月到m-1月将每个月的天数加到d上此时d已存储了日for(inti1;im;i){ddd[i];}// 输出累加结果即为当年的第几天coutd;return0;}我的题解思路这道题的核心是日期合法性判断与年积日计算。我首先用数组存储平年各月天数然后根据输入的年份判断是否为闰年若是则把二月改为29天。接下来检查输入的日是否大于该月最大天数若大于则直接输出E表示不合法。若合法我就从1月累加到m-1月将各月天数加到d上此时d就变成了当年的第几天最后输出即可。时间复杂度O(1)月份循环最多12次空间复杂度O(1)只要注意闰年判断条件%4000或%40 %100!0即可避免常见错误。本题数据范围较小直接模拟即可。