1928: 日期差值
时间限制: 1 Sec 内存限制: 32 MB
献花: 1446 解决: 395
[献花][花圈][TK题库]
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出
每组数据输出一行,即日期差值
样例输入
20130101
20130105
样例输出
5
处理日期问题时,使一个日期不断加一靠近另一个日期。
最简单的思路就是一天天的累加,天数够月则月数加一,月数够年则年数加一。
因为平闰年二月天数不同,所以设立数组来记录平闰年天数,构造函数来判断平闰年。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
using namespace std;
#define inf 0x3f3f3f
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}};
//month数组用来表示平年和闰年的每个月的天数,第一维表示月份,第二维0表示平年,1表示闰年
bool judge(int y)//判断平闰年
{
return (y%4==0&&y%100!=0)||(y%400==0);
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a>b)//始终以第一个数小为基准计算
{
int t;
t=a;
a=b;
b=t;
}
int y1=a/10000,m1=a%10000/100,d1=a%100;
int y2=b/10000,m2=b%10000/100,d2=b%100;
int ans=1;
while(y1<y2||m1<m2||d1<d2)//两个日期不相等就进行加一运算
{
d1++;
if(d1>month[m1][judge(y1)])//如果小日期的天数大于该月的天数,进入下一个月,月份加一,置为下月1号
{
m1++;
d1=1;
}
if(m1==13)//如果月份大于12,则进入下一年,月份置一
{
y1++;
m1=1;
}
ans++;//累计天数
}
printf("%d\n",ans);
}
return 0;
}