日期差值
不妨假设第一个日期早于第二个日期(否则交换即可)。
这种求日期之间相差天数的题目有一个很直接的思路,即令日期不断加1天,直到第一个日期等于第二个日期为止,即可统计出答案。具体处理时,如果当加了一天之后天数d等于当前月份m所拥有的天数加1,那么就令月份m加1、同时置天数d为1号(即把日期变为下一个月的1号);如果此时月份m变为了13,那么就令年份y加1、同时置月份m为1月(即把日期变为下一年的1月)。
const int N=110;
int month[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}
};
int n,m;
bool isLeap(int year)
{
return year % 4 == 0 && year % 100 || year % 400 == 0;
}
int main()
{
while(cin>>n>>m)
{
if(n > m) swap(n,m);
int yy1=n/10000,mm1=n%10000/100,dd1=n%10000%100;
int yy2=m/10000,mm2=m%10000/100,dd2=m%10000%100;
int ans=1;
while(yy1 < yy2 || mm1 < mm2 || dd1 < dd2)
{
ans++;
dd1++;
if(dd1 == month[isLeap(yy1)][mm1]+1)
{
mm1++;
dd1=1;
}
if(mm1 == 13)
{
yy1++;
mm1=1;
}
}
cout<<ans<<endl;
}
//system("pause");
return 0;
}
另解
求出每个日期和\(0000\)年\(1\)月\(1\)日的天数间隔,作差即可。
int month[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}
};
int n,m;
bool isLeap(int year)
{
return year % 4 == 0 && year % 100 || year % 400 == 0;
}
int calc(int yy,int mm,int dd)
{
int res=0;
for(int i=0;i<yy;i++)
if(isLeap(i))
res+=366;
else
res+=365;
for(int i=1;i<mm;i++)
res+=month[isLeap(yy)][i];
res+=dd;
return res;
}
int main()
{
while(cin>>n>>m)
{
if(n > m) swap(n,m);
int yy1=n/10000,mm1=n%10000/100,dd1=n%10000%100;
int yy2=m/10000,mm2=m%10000/100,dd2=m%10000%100;
cout<<calc(yy2,mm2,dd2)-calc(yy1,mm1,dd1)+1<<endl;
}
//system("pause");
return 0;
}