题解 | 日期累加
#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; }
对上一个解法的复杂部分进行了逻辑优化,现在代码更易读。