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