蓝桥杯 3498. 日期差值

121 阅读2分钟

3498. 日期差值 - AcWing题库

我们在写日期类问题的时候先把这三个模版写上,能用得上多少再说:

const int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};


int is_leap(int year)
{
    if(year%4==0&&year%100||year%400==0)  //四年一闰 百年不闰 四百年再润
    return 1;
return 0;
}


int get_monthday(int y,int m)
{
 
    if(m==2) return months[m]+is_leap(y);
    return months[m];
}

这道题的思路是先用公元1月1日 减 第一个日期得到从 公元1月1日到第一个日期的 天数。

再用公元1月1日减去第二个日期,得到 公元1月1日 到 第二个日期的天数。

用求出来的两个天数相减就能求出两个日期之间的天数。

image.png

code

#include<bits/stdc++.h>
using namespace std;


//写日期问题先默这三个函数,用不用得上再说

//每月天数
const int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};


//是否是闰年
int is_leap(int year)
{
    if(year%4==0&&year%100||year%400==0)  //四年一闰 百年不闰 四百年再润
    return 1;
return 0;
}


int get_monthday(int y,int m)
{
 
    if(m==2) return months[m]+is_leap(y);
    return months[m];
}


int get_total_day(int y,int m,int d)  //从公元1日1日到给定日期之间的天数
{
    int res=0;
    
    for(int i=0;i<y;i++)res+=365+is_leap(i);
    
    
    for(int i=0;i<m;i++)res+=get_monthday(y,i);
    
return res+d;
}

int main()
{
    
    int y1,m1,d1,y2,m2,d2;
    while(~scanf("%004d%02d%02d\n%04d%02d%02d",&y1,&m1,&d1,&y2,&m2,&d2)){  //多组数据
            printf("%d\n",abs(get_total_day(y1,m1,d1) -   get_total_day(y2,m2,d2) )+1);
    }
    
    
    

    return 0;
}