日期处理(日期加法)

给定一个日期Day和一个正整数n,求日期Day加上n天后的日期。

输入格式为:

第一行:YYYY-MM-DD,范围为1900-01-01到2199-12-31。

第二行:n,表示要加的天数,范围为1到10000。

难点主要在处理闰年和不同月份不同日期上,仔细一点其实也不难。(当然,是说实现不难,代码要优雅那对现在的我来说还有点困难)

#include<iostream>

/*

题目:给定一个日期Day和一个正整数n,求日期Day加上n天后的日期。

输入格式为:
第一行:YYYY-MM-DD,范围为1900-01-01到2199-12-31。
第二行:n,表示要加的天数,范围为1到10000。

*/

// 该函数判断某一年是否为闰年
bool isLeapYear(int year)
{
    return year%400==0||year%4==0&&year%100!=0;
}

const int leapYear[13]={0,31,60,91,121,152,182,213,244,274,305,335,366};
const int nonLeapYear[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};

int main()
{ 

    int year, month, day;
    int n;
    std::scanf("%d-%d-%d", &year, &month, &day);
    std::scanf("%d", &n);

    // 将输入日期的月和日加到n中一起处理
    if(isLeapYear(year))
        n+=leapYear[month-1]+day;
    else
        n+=nonLeapYear[month-1]+day;  
    // 先忽略闰年计算增加的年份
    int add_year = n/365;
    int leapYearCount=0;
    // 统计增加的年份之间闰年的总数
    for(int i=year;i<year+add_year;i++)
    {
        if(isLeapYear(i))
            leapYearCount++;
    }
    // 修正闰年的误差值,此处add_mday修正后可能为负数,需要额外处理
    int add_mday = n%365 - leapYearCount;
    if(add_mday<0)
    {
        if(isLeapYear(year+add_year-1))
            add_mday+=366;
        else
            add_mday+=365;
        add_year--;
    }
    // 计算增加的月份和日期
    int add_month;
    int add_day;
    if(isLeapYear(year+add_year))
    {
        for(int j=0;j<13;j++)
        {
            
            if(add_mday<=leapYear[j])
            {
                add_month = j;
                add_day = add_mday-leapYear[j-1];
                break;
            }
        }
    }
    else
    {
         for(int j=0;j<13;j++)
        {
            if(add_mday<=nonLeapYear[j])
            {
                add_month = j;
                add_day = add_mday-nonLeapYear[j-1];
                break;
            }
        }       
    }
    year+=add_year;
    month=add_month;
    day=add_day;
    printf("%d-%02d-%02d", year, month, day);
    return 0;
}    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值