T155144 日期间隔
题目描述:
思路:
①:连接体信息,采用结构体的方式进行存储年月日。
②:这种求日期的问题有一个很直接的思路,就是令较小的日期不断加1天,直到这个日期等于较大的日期为止,就能统计出答案了。
③:具体处理时,如果当加了一天后天数d等于这个月份m的天数加1,那么就令月份m加1,同时令天数d重置为1(即把日期变为下一月的一号)。如果当月份m等于13了,那么就令年份y加1,同时令月份重置为1(即把日期变为下一年的一月份)。
④:由于输入的两个日期不一定第一个输入的日期就是最小的,因此还要判断两者的大小,若第一个输入的日期比第二个输入的日期大,交换他们就好了。
⑤:值得注意的是还得判断年份是否是闰年。不妨设置一个二维数组int month[13][2]。用来存放每个月的天数,其中第二维为0时代表着不是闰年(即平年),为1时代表着是闰年。
AC代码:
#include<bits/stdc++.h>
using namespace std;
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}};
struct node{
int y,m,d;
}t1,t2,a,b;
bool isrun(int year)
{
return ((year%4==0&&year%100!=0)||(year%400==0));
}
int main()
{
scanf("%4d/%2d/%2d",&t1.y,&t1.m,&t1.d);
scanf("%4d/%2d/%2d",&t2.y,&t2.m,&t2.d);
int a1=t1.y*10000+t1.m*100+t1.d;
int b1=t2.y*10000+t2.m*100+t2.d;
if(a1>b1){
swap(t1,t2);
}
int ans=1;
while(t1.y<t2.y||t1.m<t2.m||t1.d<t2.d){
t1.d++;
if(t1.d==month[t1.m][isrun(t1.y)]+1){
t1.m++;
t1.d=1;
}
if(t1.m==13){
t1.y++;
t1.m=1;
}
ans++;
}
printf("%d",ans);
return 0;
}