[C/C++] 问题 A: 日期差值

问题 A: 日期差值

题目描述

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

输入

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

输出

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

样例输入

20130101
20130105

样例输出

5

运行超时:

#include<stdio.h> 

struct date{
        int y,m,d;
    };
bool isleap(int year)
{
    bool leap = false;
    if((year%4==0&&year%100==0)||year%400==0)
        leap = true;
    return leap;
}
int main()
{   
    int date1,date2;//初始化为1可以避免最后还要加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}
    };//2D数组,分别表示平年闰年的每个月的天数 
    while(scanf("%d%d",&date1,&date2)!=EOF){
        if(date1>date2){
            int t=date1;date1=date2;date2=t;
        }
        int result=1;
        struct date a={date1/10000,date1/100%100,date1%100};
        struct date b={date2/10000,date2/100%100,date2%100};
        while(a.y<b.y||a.m<b.m||a.d<b.d){
            a.d++;
            if(a.d==month[a.m][isleap(a.y)]+1){
                a.m++;
                a.d=1;
            }
            if(a.m==13){
                a.y++;
                a.m=1;
            }
            result++;

        }
        printf("%d\n",result);
    }
    return 0;
 } 

废了老鼻子劲了才写好:

#include<stdio.h> 

bool isleap(int year)
{
    bool leap = false;
    if((year%4==0&&year%100!=0)||year%400==0)
        leap = true;
    return leap;
}
int main()
{   
    struct date{
        int y,m,d;
    }a,b;
    int date1,date2;
    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}
    };//2D数组,分别表示平年闰年的每个月的天数 
    while(scanf("%d%d",&date1,&date2)!=EOF){
        if(date1>date2){
            int t=date1;date1=date2;date2=t;
        }
        int result=0;
        struct date a={date1/10000,date1/100%100,date1%100};
        struct date b={date2/10000,date2/100%100,date2%100};
            if(a.y!=b.y){//异年 
                result += month[a.m][isleap(a.y)] - a.d+1;//a.d月到月底的天数 
                result += b.d; //月初到 b.d的天数 

            for(int i=a.y+1;i<b.y;i++){//计算中间年的天数 
                if(isleap(i)){
                    result+=366;
                }
                else result+=365;
            }
            while(a.m+1<=12){//a.m的下一个月开始到本年的12月的天数
                result+=month[a.m+1][isleap(a.y)];
                a.m++;
            }
            for(int i = 1;i<b.m;i++){//1月开始到b.m-1月的天数
                result+=month[i][isleap(b.y)];
            }
            }
            else if(a.m!=b.m){//同年异月 
                result += month[a.m][isleap(a.y)] - a.d+1;//a.d月到月底的天数
                result += b.d;//月初到 b.d的天数
                for(int i=a.m+1;i<b.m;i++){//中间月的天数
                    result+=month[i][isleap(a.y)];
                } 
            }
            else{//同年同月 
                result += b.d-a.d+1; 
            }   
        printf("%d\n",result);
    }
    return 0;
 } 

这里写图片描述

猜你喜欢

转载自blog.csdn.net/dulongxiang/article/details/81610752