T1175 计算两个日期之间的天数

作者:波纹飞鱼

T1175 计算两个日期之间的天数

典明粥铺开业了,距离本店成为百年老店还有36521天!
总会有几个值得纪念的日子。那么,我们该如何计算两个日期之间的天数呢?

题目

在这里插入图片描述
初看题目,不免会让人在心里发出不屑的疑问:“就这?只需要将两个日期相减,再将结果输出。
明明和我们之前做的入门题目差不多,这么简单的题目凭什么能列为普及T2?”

解题

但是当我们仔细思考时,才会发现这道题目的核心中隐藏着许多的“坑”。
本篇博客计算天数的思路为:先分别计算出两个日期距离元年元月元日的天数,再将天数相减,从而得出两个日期之间的天数。

一,流程图

将题目中的核心提取出来,我们可以绘制出一张流程图。

Created with Raphaël 2.2.0 开始 输入两个日期 两个日期是 否在同一年? 两个日期是 否在同一月? 计算:日 输出天数 结束 计算:月,日 计算:两个日期距离 元年元月元日的天数 计算:两个天数之差 yes no yes no

二,提取关键点

大致的流程图绘制完了,但是细节决定成败,我们需要为我们的流程补充一些关键点。
1.判断两个日期间是否包含闰年的二月,若包含则需将天数加1。
2.1月时,月份所代表的天数为0。除1月外,其余月份代表的天数为本月之前月份所代表天数之和。
3.元年元月元日到目标日期的天数

三,解决关键点

1.判断闰年

为了解决这个程序我们需要在主函数前定义一个函数,用来判断一个年份是否为闰年。

int YN(int x)
{
    if(x%4!=0){
        return 0;
    }
    else if(x%100==0&&x%400!=0)
        return 0;
    else if(x%4==0)
        return 1;
}

(由于作者学艺不精,此函数较为简陋,工作原理为判断函数YN(x)的值,若等于1则x是闰年,若等于0则x不是闰年。)

2.各月份代表的天数

为表示每个月代表的天数,我们需要定义一个数组。其中包含初始月份值0和每个月的天数,即1个初始月和12个自然月,共计13个月。

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

3.元年元月元日到目标日期的天数

为计算元年元月元日到日期的天数,我们需要计算三个部分:
1.元年的总天数。
2.元年和目标年之间所有年份的总天数。
3.目标年元月月日到目标日期的总天数。
下面以元年元月元日到第一目标日期为例,元年元月元日到第二目标日期可以此类推。

for(int i1=2;i1<a1;i1++){
        tian1=tian1+365;
        if(YN(i1)==1) tian1=tian1+1;
    }
    for(int i1=2;i1<=12;i1++){
        tian1=tian1+yue[i1];
    }
    tian1=tian1+yue[1]-1;
    if(YN(1)==1){
        if(1<=2){
            tian1=tian1+1;
        }
    }
        for(int i1=1;i1<a2;i1++){
            tian1=tian1+yue[i1];
        }
        tian1=tian1+a3;
        if(YN(a1)==1){
            if(a2>2) tian1=tian1+1;
        }

编程

完成了准备工作,我们就可以正式开始编程了。
我们按照流程图编程,同时将个关键点融合,最后再添加一些细节。
那么,本题的程序便可做出:

#include<iostream>
using namespace std;

int YN(int x)
{
    if(x%4!=0){
        return 0;
    }
    else if(x%100==0&&x%400!=0)
        return 0;
    else if(x%4==0)
        return 1;
}

int main()
{
    int a1,a2,a3,b1,b2,b3;
    cin>>a1>>a2>>a3;
    cin>>b1>>b2>>b3;
    int yue[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int tian=0,tian1=0,tian2=0;
    
    if(a1==b1){
        if(a2==b2) tian=b3-a3;
        else{
            for(int i=a2+1;i<b2;i++){
                tian+=yue[i];
            }
            tian+=yue[a2]-a3+b3;
            if(YN(a1)==1){
                if(a2<=2&&b2>2) tian+=1;
            }
        }
    }
    
    else{
    for(int i1=2;i1<a1;i1++){
        tian1=tian1+365;
        if(YN(i1)==1) tian1=tian1+1;
    }
    for(int i1=2;i1<=12;i1++){
        tian1=tian1+yue[i1];
    }
    tian1=tian1+yue[1]-1;
    if(YN(1)==1){
        if(1<=2){
            tian1=tian1+1;
        }
    }
        for(int i1=1;i1<a2;i1++){
            tian1=tian1+yue[i1];
        }
        tian1=tian1+a3;
        if(YN(a1)==1){
            if(a2>2) tian1=tian1+1;
        }
        
    for(int i2=2;i2<b1;i2++){
        tian2=tian2+365;
        if(YN(i2)==1) tian2=tian2+1;
    }
    for(int i2=2;i2<=12;i2++){
        tian2=tian2+yue[i2];
    }
    tian2=tian2+yue[1]-1;
    if(YN(1)==1){
        if(1<=2){
            tian2=tian2+1;
        }
    }
                for(int i2=1;i2<b2;i2++){
            tian2=tian2+yue[i2];
        }
        tian2=tian2+b3;
        if(YN(b1)==1){
            if(b2>2) tian2=tian2+1;
        }
    tian=tian2-tian1;
    }
    cout<<tian;
    return 0;
}
发布了10 篇原创文章 · 获赞 11 · 访问量 329

猜你喜欢

转载自blog.csdn.net/lz28noi/article/details/104236090