C/C++任给两个日期,格式为年-月-日,算出两个日期相差的天数

31 篇文章 0 订阅
30 篇文章 0 订阅

任给两个日期,格式为年-月-日,算出两个日期相差的天数

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

输入
共两行:
第一行包含三个整数startYear,startMonth,startDay,分别是起始年、月、日。
第二行包含三个整数endYear,endMonth,endDay,分别是结束年、月、日。
相邻两个整数之间用单个空格隔开。

年份范围在1~3000。保证日期正确且结束日期不早于起始日期。
输出
输出一个整数,即是两个日期相差的天数。
样例输入
2008 1 1
2009 1 1
样例输出
366

一般我们自己在生活中算两个日期的差值都是很小的天数,只知道两个日期就好了,但是到俩个日期相差很大的话就很难直接算出来。
这里我们加入一个时间轴,红色是起始点,蓝色是两个所给的日期,d1是第一个日期到起始点的天数,d2是第二个日期到起始点的天数,用d2-d1就是答案。

怎么算d1,d2呢?
很简单,让你算2000年01月01日到2001年03月31日怎么算?
一般都是先算过了多少整的年份,很明显过了一年,先让d1=356*(2001-2000),加上过的完整的月份的天数,过了两个月1,2,d1=d1+31+28,最后加上日数,d1=d1+31;
如果求2000年01月01到2400年03月31日呢?
可能感觉和上面的差不多,但是如果还是直接让d1=365*(2400-2000)就错了,这样的结果不是过整年的天数,因为我们忽视了平年和闰年的区别。
从2000年到2200中间过了多少闰年?
闰年有2000 2004 2008…2096 2104…2196 2204…2296 2304…2396
如果我们每过4年加一天,那么每过100年我们会多加一天,然后我们每过100减一天,我们每过400年就少一天;
根据上面分析得到
(与2000.1.1的天数)
用所求的年份减去已知条件的年份,1997----已知条件的前面的(闰年年份+1),1901-----(前面的是100的倍数但不是400的年份+1),1601------(前面是400的倍数的年份+1) 加一很关键

d1=(year-2000)*365+(year-1997)/4-(year-1901)/100+(year-1601)/400;    

可以自己带入2001,2100,2101,试数就明白涵义了
然后算过的完整的月数
当是3月时,就将一月,二月的天数加上;还要判断这一年是否为闰年,是闰年的话2月为28天,

int yue[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    if(year%4==0 && year%100!=0 || year%400==0) yue[2]=29;
    else yue[2]=28;
 for(i=0;i<month;i++)
    {
        d1=yue[i];
    }

最后加上日期数就算出到起始的天数了;

d1+=day;

同样通过相同的做法将第二个日期到起始点的天数算出来,然后相减即可。
下面是完整的代码

# include <iostream>
# include <cstring>
# include <cstdio>
struct data
{
    int year;//对应年
    int month;//对应月
    int day;//对应日
};

int main()
{
    data start,endd;
    std::cin>>start.year>>start.month>>start.day;//输入第一个日期
    std::cin>>endd.year>>endd.month>>endd.day;//输入第二个日期
    int yue[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//月份对应的天数(例如yue[1]就是一月的天数)
    if(start.year%4==0 && start.year%100!=0 || start.year%400==0) yue[2]=29;//如果这一年是闰年,二月有29天;
    else yue[2]=28;//不是闰年,二月有28天;
    int day,i,day1,ans;//day 是第一个日期到0年0月0日的天数,day1是第二个日期到0年0月0日的天数;
    day=start.year*365+(start.year-1)/4-(start.year-1)/100+(start.year-1)/400;//通过累加算出有第一年到0年的年数的天数(例如1年03月01日到0年0月0日的年数是一年,有365天
    day+=strat.day;//加上过的天数;
    for(i=0;i<start.month;i++)
    {
        day+=yue[i];//加上过的月数的天数,(例如1年03月01日到0年0月0日的月数是3个月,完整的过了两个月,1月,2月,有0+31+28天;
    }
    //下面是算第二个日期到0年0月0日的天数
    if(endd.year%4==0 && endd.year%100!=0 || endd.year%400==0) yue[2]=29;
    else yue[2]=28;
    day1=endd.year*365+(endd.year-1)/4-(endd.year-1)/100+(endd.year-1)/400+endd.day;
    for(i=0;i<endd.month;i++)
    {
        day1+=yue[i];
    }
    ans=day1-day;//天数之差
    std::cout<<ans;

    return 0;

}

本题来源OpenJudge 1.13.25–计算两个日期的天数,已AC。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值