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);
}
}