我们在写日期类问题的时候先把这三个模版写上,能用得上多少再说:
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日 到 第二个日期的天数。
用求出来的两个天数相减就能求出两个日期之间的天数。
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;
}