(CodeupC语言)1928日期差值

日期差值

题目描述

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

输入

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

输出

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

样例输入

20130101
20130105

样例输出

5

这个题没什么好说的就是很麻烦就对了。。。

首先明确一下:

闰年:

普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);
世纪闰年:能被400整除的为世纪闰年。(如2000年是世纪闰年,1900年不是世纪闰年);

if((i%4 == 0 && i%100 != 0) || (i%400 == 0))
        是闰年,366天,2月29号;
else
        是平年/正常年,365天,2月28号;

 

先贴上正确代码:

哦,codeup没用过,不知道咋回事,一直提交不上去,但是计算结果应该是对的;

而且吐槽一下叫“codeup墓地”是因为原网站挂了吗,现在的好像是某位大神私人搭建的?

#include <stdio.h>
#include <stdlib.h>

int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
        int dateA,dateB;
        scanf("%d%d",&dateA,&dateB);

        //保证后面的比前面的那个大
        int temp =0;
        if(dateA>dateB)
        {
            temp = dateA;
            dateA = dateB;
            dateB = temp;
        }

        //先处理输入,把年月日提出来
        int yearA,monthA,dayA,yearB,monthB,dayB;
        yearA = dateA/10000;
        monthA = (dateA/100)%100;
        dayA = dateA%100;
        yearB = dateB/10000;
        monthB = (dateB/100)%100;
        dayB = dateB%100;

        //输出一下输入处理的对不对
        //printf("%d-%d-%d\n",yearA,monthA,dayA);
        //printf("%d-%d-%d\n",yearB,monthB,dayB);

//---------------------------------------------------------------------------------------
        int tYear=yearA,tMonth=monthA,tDay=dayA;
        int differ = 1;
        //按天走
        //比如2018-02-01到2019-01-17
        //天满进月,月满进年,一直到等于B为止
        while(tYear != yearB || tMonth!=monthB || dayB!=tDay)
        {
            if((tYear%4 == 0 && tYear%100 != 0) || (tYear%400 == 0))
                month[1]=29;
            else
                month[1]=28;

            tDay++;
            differ++;
            //printf("%d\t",tDay);
            if(tDay==month[tMonth-1])
            {
                tMonth++;
                tDay = 1;
                differ++;
                //printf("\n月++,月=%d\n",tMonth);
                if(tMonth==13)
                {
                    if(tYear==yearB){
                        differ--;
                        break;
                    }
                    tYear++;
                    tMonth=1;
                    //printf("\n年++,年=%d\n",tYear);
                }
            }
        }
//---------------------------------------------------------------------------------------
        //printf("\n相差%d天\n",differ);
        printf("%d",differ);
        return 0;
}

这个代码的思路:

     用month存了一下各个月份的天数(后面的monthA、monthB是输入的AB两个日期的月份,起名不规范,调试两行泪)

     PS:其中我的闰年处理是放到year++的那一部分了,因为变的只有2月的天数,所以说反复赋值不违背道德吧。

     首先将输入的两个数字处理一下,比较一下让A日期在B日期的前面。之后提取出分别的年月日来,存一下;

    然后开始计算日期差值:这个方法是从日期A开始一直++,一直加到==日期B,当然需要一个记数变量。每次day加到月底就让月份month加一,每次month到年底就year++(大概类似于进制进位吧)。日->月->年。

    Last,输出,完事儿了。


为什么这个题用了这么长时间呢,因为一上来思路不是这个。这个是看了《算法笔记》才知道的思路。

我一开始的思路是分情况讨论:如下

 //处理:要分情况讨论吗
    //20120101与20120102之间是2,也就是dayB-dayA+1
    /*年月日相同
    同年同月不同日
    同年不同月同日
    同年不同月不同日

    不同年同月同日
    不同年同月不同日
    不同年不同月同日
    不同年不同月不同日

    */

这个逻辑是使用加法,(A月底-A日期)+(B月-1  -  A月+1)+(B月日期-B月1号)

也就是说,A月的一部分+AB中间月的天数+B月的天数。当然年数也是如此,只不过把天数换成月数,月数换成年数。

 于是开始写代码。。哇这个逻辑好像挺清晰,但是实际上。。。而且我后来想要优化代码,把代码整啊整啊最后gg了,连自己都不知道在写什么了。。。混乱的一批

把丢人代码也贴在这里当个教训吧:

#include <stdio.h>
#include <stdlib.h>

int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
    int i;
    int dateA,dateB;
    scanf("%d%d",&dateA,&dateB);

    //保证后面的比前面的那个大
    int temp =0;
    if(dateA>dateB)
    {
        temp = dateA;
        dateA = dateB;
        dateB = temp;
    }

    //先处理输入,把年月日提出来
    int yearA,monthA,dayA,yearB,monthB,dayB;
    yearA = dateA/10000;
    monthA = (dateA/100)%100;
    dayA = dateA%100;
    yearB = dateB/10000;
    monthB = (dateB/100)%100;
    dayB = dateB%100;

    printf("%d-%d-%d\n",yearA,monthA,dayA);
    printf("%d-%d-%d\n",yearB,monthB,dayB);

    //处理:要分情况讨论吗
    //20120101与20120102之间是2,也就是dayB-dayA+1
    /*年月日相同
    同年同月不同日
    同年不同月同日
    同年不同月不同日

    不同年同月同日
    不同年同月不同日
    不同年不同月同日
    不同年不同月不同日

    其实最后一种可以包括以上所有吧。。。。
    */
    int differ=1;

    //普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);
    //世纪闰年:能被400整除的为世纪闰年。(如2000年是世纪闰年,1900年不是世纪闰年);

    //因为前面交换了,所以说这里只有a小于b或者a==b
    if(yearA < yearB)
    {
        
        if(monthB>=monthA&& dayB>dayA)
        {
            for(i=yearA; i<yearB; i++)
            {
                if((i%4 == 0 && i%100 != 0) || (i%400 == 0))
                {
                    differ += 366;
                }
                else
                {
                    differ += 365;
                }
            }
        }
        else{
            for(i=yearA+1; i<yearB; i++)
            {
                if((i%4 == 0 && i%100 != 0) || (i%400 == 0))
                {
                    differ += 366;
                }
                else
                {
                    differ += 365;
                }
            }
        }

    }

//----------------------------------------------------------上面有问题
    if(monthA==monthB)
    {
        if(dayA == dayB)
            differ = 0;
        else
            differ = differ+ dayB - dayA;

    }
    else
    {
        if(monthB>monthA)
            for(i = monthA+1; i<monthB; i++)
                differ += month[i];
        else
        {
            for(i = monthA+1; i<12; i++)
                differ += month[i];
            for(i=0; i<monthB; i++)
                differ +=month[i];
        }
    }

    if(dayA!=dayB)
    {
        //例如3月15到6月18,就是3.31-15,+4.day+5.day,+6.18;
        differ += month[monthA]-dayA;
        differ += dayB;
    }



    /*if(yearB- yearA>1){
        for(i=yearA;i<yearB;i++)
        {
            if((i%4 == 0 && i%100 != 0) || (i%400 == 0)))
            {
                differ += 366;
            }
            else{
                differ += 365;
            }
        }
    }
    if(monthB-monthA>1)
    {
        for(i=monthA+1;i<monthB-1;i++){

        }

    }
    */
    printf("%d年%d月%d日与%d年%d月%d日之间相差:",yearA,monthA,dayA,yearB,monthB,dayB);
    printf("%d天",differ);
    return 0;
}

如果日后有空我来把它当做逻辑题来练练脑子也行哈==因为脑子本来就笨,不给我个笔我连3位数的加减法都算不出来。。。 

这个速度刷题,好慢啊遥遥无期。。。丢skr人

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值