题解 | 日期累加

#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;
}

对上一个解法的复杂部分进行了逻辑优化,现在代码更易读。

全部评论

相关推荐

真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
05-12 17:28
已编辑
门头沟学院 硬件开发
ldf李鑫:不说公司名祝你以后天天遇到这样的公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务