codeup1928 日期差值

题目描述

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

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

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

示例1
输入

20110412
20110422

输出

11

代码
这是我自己的理解,参考答案稍后贴出

#include<cstdio>
#include<cmath>

int month_day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int main()
{
    char date1[9],date2[9];
    scanf("%s%s",date1,date2);
    //转换为数字
    int year1,year2,month1,month2,day1,day2;
    year1=(date1[0]-'0')*1000+(date1[1]-'0')*100+(date1[2]-'0')*10+(date1[3]-'0');
    year2=(date2[0]-'0')*1000+(date2[1]-'0')*100+(date2[2]-'0')*10+(date2[3]-'0');
    month1=(date1[4]-'0')*10+(date1[5]-'0');
    month2=(date2[4]-'0')*10+(date2[5]-'0');
    day1=(date1[6]-'0')*10+(date1[7]-'0');
    day2=(date2[6]-'0')*10+(date2[7]-'0');
    int temp,days=0;;

    if(year1==year2) //如果year1和year2同年,则直接加月份
    {
        if(month1>month2)
        {
            temp=month1;
            month1=month2;
            month2=temp;
            temp=day1;
            day1=day2;
            day2=temp;
        }
        else if(month1==month2)
        {
            days+=abs(day1-day2)+1;
            goto PrintDays;
        }
        //先将剩下的month1天数加完
        days+=month_day[month1]-day1+1;
        for(int i=month1+1;i<month2;i++)
        {
            days+=month_day[i];
        }
        //再加上day2
        days+=day2;
        goto PrintDays;
    }
    if(year1>year2)
    {
        //如果year1>year2将两个日期相交换
        temp=year1;
        year1=year2;
        year2=temp;

        temp=month1;
        month1=month2;
        month2=temp;

        temp=day1;
        day1=day2;
        day2=temp;
    }
    //先将year1剩下的天数加完再其他的
    //把本月剩下的天数加完
    days+=month_day[month1]-day1+1;
    //把本年的剩下月份加完
    for(int i=month1+1;i<=12;i++)
    {
        days+=month_day[i];
    }
    if(year2-year1>1)
    {
        //加上相差的年份
        for(int i=year1+1;i<year2;i++)
        {
            //判断闰年 能被4整除不能被100整除  或能被400整除
            if((i%4==0&&i%100!=0)||i%400==0)
            {
                days+=366;
            }
            else
            {
                days+=365;
            }
        }
    }
    //加上最后一年的月份
    for(int i=1;i<month2;i++)
    {
        days+=month_day[i];
    }
    //加上month2的天数
    days+=day2;
    //如果最后一年是闰年且经过了2月则要days+1
    if((year2%4==0&&year2%100!=0||year2%400==0)&&(month2>2||(month2==2&&day2==29)))
       days++;
PrintDays:
    printf("%d\n",days);
    return 0;
}

结果
这里由于题目要求规定相邻两天记为2,所以要比普通计算多一天!
在这里插入图片描述
也可以交换日期
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰西啊杰西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值