codeup100000578.日期差值

本文介绍了一种计算两个日期间天数差的方法,通过不断累加一天直到与第二个日期相等,考虑了平年和闰年的差异。使用C++实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日期差值


题目

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入格式

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出格式

每组数据输出一行,即日期差值

输入样例:

20130101
20130105

输出样例

5

题目链接


思路:

  1. 假设第一个日期早于第二个日期(否则交换即可)
  2. 令第一个日期不断加1天,直到等于第二个日期为止
  3. 如果当加了一天之后天数d等于当前月份m所拥有的天数加1,那么就令月份m加1,同时设置天数d为1号
            dd1++;
            //到下一个月
            if(dd1 == month[mm1][isLeap(yy1)] + 1)
            {
                mm1++;
                dd1 = 1;
            }
  1. 如果月份变为13,那么就令年份y加1,同时设置月份m为1月
            if(mm1 == 13)
            {
                yy1++;
                mm1 = 1;
            }

代码:

/**
* @tag     codeup-100000578
* @authors R11happy (xushuai100@126.com)
* @date    2016-8-15
* @version 1.0
* @Language C++
* @Ranking  null
* @function 计算两个日期的差值
* 思路:日期不断累加,直到与第二个日期相等为止
*/

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;    //直接调用swap函数需要

//统计平年和闰年每个月的天数,month[][0]代表润年,month[][1]代表平年
int month[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};

bool isLeap(int year)
{
    //判断整除要用%
    return (year % 4==0 && year % 100 != 0) || (year % 400 == 0);
}

int main(int argc, char const *argv[])
{
    int yy1, mm1, dd1;
    int yy2, mm2, dd2;
    long long time1, time2; //也可以用int类型,正负8位都没问题
    //没有指定次数时用
    while(scanf("%lld%lld", &time1, &time2) != EOF)
    {
        int cnt = 1;//有EOF先想初始化
        //第一个日期晚于第二个日期,则交换
        //必须要先交换
        if(time1 > time2)   swap(time1, time2);
        yy1 = time1 / 10000;
        mm1 = time1 % 10000 / 100;
        dd1 = time1 % 100;

        yy2 = time2 / 10000;
        mm2 = time2 % 10000 / 100;
        dd2 = time2 % 100;
        //time1不断递增,直到与time2相等为止
        while(yy1 != yy2 || mm1 != mm2 || dd1 != dd2)
        {
            dd1++;
            //到下一个月
            if(dd1 == month[mm1][isLeap(yy1)] + 1)
            {
                mm1++;
                dd1 = 1;
            }
            //到下一年
            if(mm1 == 13)
            {
                yy1++;
                mm1 = 1;
            }
            cnt++;
        }
        printf("%d\n",cnt );
    }
    return 0;
}

收获:

1.用isLeap函数和二维数组联合处理年份和月份的问题:

//统计平年和闰年每个月的天数,month[][0]代表润年,month[][1]代表平年
int month[13][2] = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};

bool isLeap(int year)
{
    //判断整除要用%
    return (year % 4==0 && year % 100 != 0) || (year % 400 == 0);
}

2.要先交换,再获取年月日的信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值