第一题:根据一年中的第
n
天计算日期📌 知识点
判断闰年:
- 闰年条件:能被
400
整除,或 能被4
整除但不能被100
整除。- 平年:2 月 28 天;闰年:2 月 29 天。
累加月份,找到
n
属于哪个月:
- 定义
day[]
数组,存储 1~12 月的天数(默认 28 天的 2 月)。- 遍历
day[]
,n > day[i]时候,
减少n
,找到n
归属于哪个月。格式化输出
yyyy-MM-dd
:
- 月份 & 日期小于 10 时补
0
,保证输出格式。
⚠️ 代码注意点
✅ 闰年判断 → 修改
day[1] = 29
(二月改为 29 天)。
✅ 使用while(n > day[i])
遍历day[]
数组,逐步减少n
,找到具体的月份
&日期
。
✅ 输出格式化 →printf("%04d-%02d-%02d\n", y, month, day);
确保补0
。
📌 第二题:求输入日期的后一天
📌 题目考点
处理多组输入
- 第一行输入
m
(表示m
组测试数据)。- 接下来
m
行,每行有 3 个整数:yyyy mm dd
(表示 年份、月份、日期)。月份天数处理
- 定义
day[]
数组,存储 1~12 月的天数(默认 不考虑闰年)。- 如果
day+1 > 当前月天数
,说明 需要进位到下个月。- 如果
month+1 > 12
,说明 需要进位到下一年。格式化输出
yyyy-MM-dd
- 月份 & 日期小于 10 时补
0
,确保符合yyyy-MM-dd
标准格式。
📌 代码注意点
✅ 处理多组输入 → 使用
while (m--)
读取m
组数据。while(m--){cin<<x<<y}
✅ 使用day[]
数组存储每月天数,确保正确计算日期。
✅ 如果day+1 > d[month-1]
,进入下个月;如果month > 12
,进入下一年。
✅ 格式化输出yyyy-MM-dd
,保证补0
。
题目一
- 给出年份
y
和一年中的第n
天,计算n
天是 几月几号。
输入描述
- 输入包含 两个整数:
y
:年份(1 ≤ y ≤ 3000
)n
:一年中的第n
天(1 ≤ n ≤ 366
)
-
#include <iostream> using namespace std; //日期类 int main(){int y,n;while(cin>>y>>n){//判断闰年// 定义每个月的天数(默认为平年)int day[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if(y>=1&&y<=3000&&n>=1&&n<=365){// 判断是否为闰年,修改二月天数if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) {day[1] = 29;}int i =0;while(n>day[i]){n=n-day[i];i++;}//cout<<y<<"-"<<i+1<<"-"<<n;// 格式化输出:yyyy-MM-DD(月份和日期小于 10 时前面补 0)printf("%04d-%02d-%02d\n", y,i+1, n);}return 0; } }
题目二
📌 题目描述
-
输入
- 第一行输入
m
(表示有m
组测试数据)。 - 接下来的
m
行,每行包含 3 个整数:yyyy mm dd
(分别表示 年份、月份、日期)。 - 保证测试数据不会有闰年。
- 第一行输入
-
输出
- 输出
m
行,每行表示输入日期的后一天,格式为yyyy-mm-dd
。
- 输出
📌 示例
输入
2
1999 10 20
2001 1 31
输出
1999-10-21
2001-02-01
#include <iostream>
using namespace std;
//日期类
int main(){int m;int y,month,day;cin>>m;while(m--){cin>>y>>month>>day;// 定义每个月的天数(默认为平年)int d[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(y>=1&&y<=3000&&day>=1&&day<=365){if(day+1>d[month-1]){month+=1;day =1;if (month>12){month=1;y++;}}}else{day+=1;}//cout<<y<<"-"<<i+1<<"-"<<n;// 格式化输出:yyyy-MM-DD(月份和日期小于 10 时前面补 0)printf("%04d-%02d-%02d\n", y,month, day);}return 0;
}