http://ac.jobdu.com/problem.php?pid=1096
很经典的计算任意两个日期之间的差值。
方法:利用预处理,以空间换时间的方法,计算任意日期与初始日期0年1月1日之间的差值。再讲两差值求差+1即可。本题关键在预处理部分
#include<stdio.h>
#define
ISYEAR(x) x%100!=0&&x%4==0||x%400==0?1:0
int
dayOfMonth[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
Date{
int
Day;
int
Month;
int
Year;
void
nextDay(){ //计算下一天日期
Day++;
if
(Day>dayOfMonth[Month][ISYEAR(Year)]){
//如果日期超过了当月的最大日期
Day=1;
Month++;
//进入下一月
if
(Month>12){
//月份超过12
Month=1;
Year++;
//进入下一年
}
}
}
};
int
buf[5001][13][32];//保持预处理的天数
int
Abs(int
x){
return
x<0?-x:x;
}
int
main()
{
Date
tmp;
int
cnt=0;//天数计数
tmp.Day=1;
tmp.Month=1;
tmp.Year=0;
//初始化日期类对象为0年1月1日
while
(tmp.Year!=5001){
//日期不超过5000年
buf[tmp.Year][tmp.Month][tmp.Day]=cnt;
//将该日与0年1月1日的天数差保持起来
tmp.nextDay();
//计算下一天日期
cnt++;
}
int
d1,m1,y1;
int
d2,m2,y2;
while
(
scanf
(
"%4d%2d%2d"
,&y1,&m1,&d1)!=EOF){
scanf
(
"%4d%2d%2d"
,&y2,&m2,&d2);
printf
(
"%d\n"
,Abs(buf[y2][m2][d2]-buf[y1][m1][d1])+1);
}
}