25:计算两个日期之间的天数【2019信科夏令营考前练习A】

25:计算两个日期之间的天数【2019信科练习A】

  • 查看

  • 提交

  • 统计

  • 提问

  • 总时间限制:

    1000ms

  • 内存限制:

    65536kB

  • 描述

    给定两个日期,计算相差的天数。比如2010-1-1和2010-1-3相差2天。

  • 输入

    两行: 第一行包含三个整数startYear,startMonth,startDay,分别是起始年、月、日。 第二行包含三个整数endYear,endMonth,endDay,分别是结束年、月、日。 相邻两个整数之间用单个空格隔开。 年份范围在1~3000。保证日期正确且结束日期不早于起始日期。

  • 输出

    输出一个整数,即是两个日期相差的天数。

  • 样例输入

    2008 1 1
    2009 1 1
    
  • 样例输出

    366

  • 提示

    闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。闰年的2月份有29天。

题解

  • 以开始年的第一天为起点,计算两个日期的天数,差值为所求
    • 一个组件:平/闰年m月d日是该年的第几天(1月1日是第一天)
bool isleap(int y)
{
    return y%400==0 || (y%100 && y%4==0);
}
int mdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int get_days_m_d(int m,int d,bool is_leap)
{
    int day=0;
    for(int i=1; i<m; ++i){
        day+=mdays[i];
    }
    if(is_leap && m>2){
        ++day;
    }
    return day+d;
}
int main()
{
    int y1,m1,d1;
    int y2,m2,d2;
    cin>>y1>>m1>>d1>>y2>>m2>>d2;
    int day1=get_days_m_d(m1,d1,isleap(y1));
    int day2=get_days_m_d(m2,d2,isleap(y2));
    //and [y1,y2) days
    day2+=(y2-y1)*365;
    for(int y=y1; y<y2; ++y){
        if(isleap(y)){
            ++day2;
        }
    }
    cout<<day2-day1<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值