题解 | 日期累加
#include <bits/stdc++.h>
using namespace std;
// 每年的月份对应天数
int days_in_month[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, // 非闰年
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} // 闰年
};
// 判断是否是闰年
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 根据天数计算新的日期
void add_days_to_date(int& year, int& month, int& day, int add_days) {
// 计算当年剩余天数
int leap = isLeapYear(year) ? 1 : 0;
int current_year_days = leap ? 366 : 365;
while (add_days > current_year_days - (day - 1)) {
add_days -= current_year_days - (day - 1); // 扣除当前年剩余天数
year++; // 进入下一年
leap = isLeapYear(year) ? 1 : 0;
current_year_days = leap ? 366 : 365;
month = 1; // 重置月份
day = 1; // 重置日期
}
// 处理剩余天数
day += add_days;
while (day > days_in_month[leap][month]) {
day -= days_in_month[leap][month];
month++;
if (month > 12) { // 跨年逻辑
month = 1;
year++;
leap = isLeapYear(year) ? 1 : 0;
}
}
}
int main() {
int n;
while (cin >> n) {
while (n--) {
int year, month, day, add_days;
cin >> year >> month >> day >> add_days;
// 计算新日期
add_days_to_date(year, month, day, add_days);
// 输出结果
printf("%04d-%02d-%02d\n", year, month, day);
}
}
return 0;
}
对上一个解法的复杂部分进行了逻辑优化,现在代码更易读。
查看11道真题和解析