• 日期差值


    思考1:首先日期是闰年还是平年。闰年分为普通闰年(年份是4的倍数但不是100的倍数)和世纪闰年(是四百的倍数)。我们可以写个布尔函数isRun()判断是否为闰年(是闰年则返回1,是平年返回0)。用宏定义也可以。

    思考2:创建二维数组。buff[2][13](日期从下标1开始),根据buff[isRun(year)][j]区分闰年和平年。其中buff[0][j]表示平年(j=1,2..12),buff[1][j]表示闰年。

    思考3:判断两个日期年份是否相同。然后判断两个日期的月份是否相同。(不同的情况会有不同的代码!!!)

    #include<cstdio>
    using namespace std;
    
    //平年为buff[0][j],闰年为buff[1][j]
    int buff[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
                     {0,31,29,31,30,31,30,31,31,30,31,30,31}};
    bool isRun(int year){
        if(year%400==0 || (year%4==0 && year%100!=0))
            return 1;
        else
            return 0;
    }
    
    int main()
    {
        int a,b;
        int year1,year2,month1,month2,day1,day2;
        int ans;
    
        while(scanf("%d%d",&a,&b)!=EOF){
            ans=0;
            year1=a/10000;
            year2=b/10000;
            month1=a%10000/100;
            month2=b%10000/100;
            day1=a%10000%100;
            day2=b%10000%100;
            printf("year1:%d month1:%d day1:%d
    ",year1,month1,day1);
            printf("year2:%d month2:%d day2:%d
    ",year2,month2,day2);
    
            //year~year2之间的天数(不包括year1和year2)
            for(int i=year1+1;i<=year2-1;i++){
                if(isRun(i))
                    ans+=366;
                else
                    ans+=365;
            }
    
            //计算year1年和year2年的天数(讨论year1和year2是否相等)
            if(year1==year2){
                //判断是否在同一月
                if(month1==month2)
                    ans+=(day2-day1+1);
                else{
                    //计算month1和month2之间的天数(不包括month1和month2)
                    for(int i=month1+1;i<=month2-1;i++){
                        ans+=buff[isRun(i)][i];
                    }
                    ans+=(buff[isRun(year1)][month1]-day1+1)+day2;
                }
            }
            //不是同一年
            else{
    
                for(int i=month1+1;i<=12;i++){
                    ans+=buff[isRun(year1)][i];
                }
                ans+=buff[isRun(year1)][month1]-day1+1;
                for(int i=1;i<=month2-1;i++){
                    ans+=buff[isRun(year2)][i];
                }
                ans+=day2;
            }
    
            printf("日期差:%d
    ",ans);
        }
            return 0;
    }

    方法二:

    设定0年1月1为原点日期,用数组保存每个日期和原点日期的日期差(buf[year][month][day])。计算两个特定的日期差时只需要两个数组值相减然后再加1即可。

    采用了空间换时间的思想,用O(1)的时间复杂度将保存的数据取出。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define ISYEAP(x) ((x%100!=0 && x%4==0) ||x%400==0)?1:0
    
    //平年为dayOfMonth[0][j],闰年为dayOfMonth[1][j]
    int dayOfMonth[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
                     {0,31,29,31,30,31,30,31,31,30,31,30,31}};
    
    struct Date{
        int year;
        int month;
        int day;
        void nextDay(){
            day++;
            if(day>dayOfMonth[ISYEAP(year)][month]){
                day=1; //置1
                month++;
                if(month>12){
                    month=1;//置1
                    year++;
                }
            }
        }
    };
    int buf[5001][13][32]={0}; //年月日
    int main()
    {
        Date tmp;
        //初始化日期0年1月1日
        tmp.year=0;
        tmp.month=1;
        tmp.day=1;
        int cnt=0;  //日期差
        while(tmp.year!=5001){
            buf[tmp.year][tmp.month][tmp.day]=cnt;
            tmp.nextDay();
            cnt++;
        }
        int y1,m1,d1;
        int y2,m2,d2;
        while(scanf("%4d%2d%2d",&y1,&m1,&d1)!=EOF){
            scanf("%4d%2d%2d",&y2,&m2,&d2);
            printf("%d
    ",abs(buf[y2][m2][d2]-buf[y1][m1][d1])+1);
        }
        return 0;
    }

  • 相关阅读:
    在intellij 下用java spring + Mysql + Hibernate 开发的第一个数据库demo
    推荐一个找到一个比较好的spring,java学习教程
    ReactiveCocoa 中signal(operation) then与doNext的区别
    grunt
    Swiper.js wap app 图片滑动效果
    less 路径 写法
    html5 input placeholder 占位符 输入框提示文本
    js 大小写转换
    css 修改选中文字的颜色
    keydown keypress keyup textInput
  • 原文地址:https://www.cnblogs.com/mld-code-life/p/12214784.html
Copyright © 2020-2023  润新知