题目来自牛客

思路:首先得先读取输入的多组数据 然后首先要判断的是年份问题 因为年份要分闰年和平年每年天数会有些许差异
定义与设立目的
- 闰年:是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。地球绕太阳公转一周的实际时间约为 365.2422 天 ,而平年按 365 天计算,每年会少约 0.2422 天,日积月累差距会增大,所以每四年增加一天,这一年就是闰年,让历法时间更接近天文时间。
- 平年:指阳历没有闰日或者农历没有闰月的年份,是历法中的常规年份,用于标记时间流逝。
天数差异
- 闰年:一年有 366 天 。其中 2 月有 29 天,比平年 2 月多 1 天;其他月份天数与平年相同,即 1、3、5、7、8、10、12 月有 31 天,4、6、9、11 月有 30 天。
- 平年:一年有 365 天 。2 月有 28 天;1、3、5、7、8、10、12 月为 31 天,4、6、9、11 月为 30 天。
计算方式(判断方法)
- 闰年 :
- 非整百年份:能被 4 整除的年份就是闰年。例如 2024 年,2024÷4 = 506,没有余数,所以 2024 年是闰年 。
- 整百年份:必须能被 400 整除才是闰年 。比如 2000 年,2000÷400 = 5,没有余数,2000 年是闰年;而 1900 年,1900÷400 = 4......300,有余数,所以 1900 年是平年。
- 平年:一般年份数不能被 4 整除,或者整百年份数不能被 400 整除的年份就是平年。例如 2023 年,2023÷4 = 505......3,有余数,所以 2023 年是平年 。
cpp
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
// 定义变量 y 用于存储输入的年份,n 用于存储该年中的第 n 天
int y, n;
// 循环读取输入,直到输入结束(例如遇到文件结束符)
while (cin >> y >> n) {
// 定义数组 daysPerMonth 来存储每个月的天数,初始时按照平年设置
// 索引 0 对应 1 月,索引 1 对应 2 月,以此类推
int daysPerMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 判断输入的年份是否为闰年
// 闰年的判断规则:能被 4 整除但不能被 100 整除,或者能被 400 整除
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
// 如果是闰年,将 2 月的天数从 28 天修改为 29 天
daysPerMonth[1] = 29;
}
// 定义变量 sumDays 用于累加从 1 月开始到当前月份的总天数
int sumDays = 0;
// 定义变量 month 用于存储最终计算出的月份,初始设为 1 月
int month = 1;
// 遍历每个月
for (int i = 0; i < 12; ++i) {
// 累加当前月份的天数到 sumDays 中
sumDays += daysPerMonth[i];
// 检查累加的总天数是否已经超过或等于输入的第 n 天
if (sumDays >= n) {
// 如果超过或等于,说明找到了对应的月份,将月份赋值给 month
// 注意数组索引从 0 开始,所以要加 1 得到实际的月份
month = i + 1;
// 计算该月的具体日期
// 用输入的第 n 天减去当前月份之前所有月份的总天数
int day = n - (sumDays - daysPerMonth[i]);
// 格式化输出结果,按照 yyyy-mm-dd 的格式
// setw(4) 和 setfill('0') 确保年份输出为 4 位,不足 4 位时前面补 0
// 同理,月份和日期输出为 2 位,不足 2 位时前面补 0
cout << setw(4) << setfill('0') << y << "-"
<< setw(2) << setfill('0') << month << "-"
<< setw(2) << setfill('0') << day << endl;
// 找到结果后,跳出循环,不再继续遍历后续月份
break;
}
}
}
return 0;
}
在这基础之上也可以实现

cpp
#include <iostream>
#include <iomanip>
// 判断是否为闰年
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
int m;
std::cin >> m;
while (m--) {
int year, month, day, addDays;
std::cin >> year >> month >> day >> addDays;
// 每个月的天数,初始按照平年设置
int daysPerMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysPerMonth[1] = 29; // 闰年 2 月有 29 天
}
// 加上增加的天数
day += addDays;
while (day > daysPerMonth[month - 1]) {
day -= daysPerMonth[month - 1];
month++;
if (month > 12) {
year++;
month = 1;
if (isLeapYear(year)) {
daysPerMonth[1] = 29;
} else {
daysPerMonth[1] = 28;
}
}
}
// 格式化输出结果
std::cout << std::setw(4) << std::setfill('0') << year << "-"
<< std::setw(2) << std::setfill('0') << month << "-"
<< std::setw(2) << std::setfill('0') << day << std::endl;
}
return 0;
}