题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
解答:
所有与日期有关的题目,都可以套用这个代码进行改变。
一个宏定义巧妙的控制闰年平年
一个日期结构体保存三个int值
用buf三维数组保存三个坐标组成的日期距离0年1月1日的天数,存为全局变量,而不是放在main函数里,
是为了预处理用空间换时间,在main函数里时可以直接查找对应的天数即可
nextDay函数不能直接传变量,应该用指针传值,因为形参不能给实参传值。
%4d可以一次性输入4位整数。
代码如下:
#include<stdio.h>
#define ISLEAP(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 (struct date * d){
d->day++;
if (d->day > dayOfMonth[d->month][ISLEAP(d->year)]){
d->day = 1;
d->month ++;
if ( d->month > 12 ){
d->month = 1;
d->year++;
}
}
}
int buf[5001][13][32];
int abs(int x){
return x > 0 ? x : -x;
}
int main(){
struct date *d = NULL;
struct date temp;
int cnt=1;
int d1,m1,y1;
int d2,m2,y2;
d = &temp;
d->day = 1;
d->month = 1;
d->year = 0;
while ( d->year != 5001 ){
buf[d->year][d->month][d->day] = cnt;
cnt++;
nextDay(d);
}
while ( scanf ("%4d%2d%2d",&d1,&m1,&y1) != EOF ){
scanf ("%4d%2d%2d",&d2,&m2,&y2);
printf("%d",abs(buf[d1][m1][y1] - buf[d2][m2][y2])+1);
}
}