上海计算机学会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 28001800Y2800

1≤M≤121 \le M \le 121M12

1≤D≤311 \le D \le 311D31

样例

样例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)即可避免常见错误。本题数据范围较小,直接模拟即可。