#include<stdio.h>
#define isLeapYear(x) x%100 != 0 && x%4 == 0 || x%400 == 0 ? 1 : 0 //使用宏定义是否是闰年
//using namespace std;
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
};//注意别丢了后面的分号,最后一个31后面木有逗号
struct date{
int year;
int month;
int day;
void nextDay()
{
day++;
if( day> dayOfMonth[month][ isLeapYear(year) ] )
{
day = 1;
month++;
if(month > 12)
{ month = 1; year++; }
}//注意 这个计算下一天二等函数是写在结构体里面的,注意哦哦
}
}; //struct后面记得加分号!!!!刚才忘记了,然后出现好几个错误喔!!!
int buf[5001][13][32];
//忘记写求绝对值的函数了
int Abs( int x)
{
return x<0 ? -x : x ;
}
int main()
{
date tmp;
tmp.year = 0;
tmp.month = 1;
tmp.day = 1;
int cnt = 0;// 天数计数
while( tmp.year != 5001)
{
buf[tmp.year][tmp.month][tmp.day] = cnt;
tmp.nextDay();
cnt++;
}
int y1, m1, d1;
int y2, m2 ,d2;
//while( scanf("%4d%2d%2d", &buf[y1][m1][d1] ) != EOF ) 注意不能这样写,运行中报好多错误。
while( scanf("%4d%2d%2d", &y1,&m1, &d1 ) != EOF )
{
//scanf("%4d%2d%2d", &buf[y2][m2][d2] );
scanf("%4d%2d%2d", &y2,&m2,&d2 );
printf("%d\n", Abs(buf[y2][m2][d2]-buf[y1][m1][d1] )+1 );
}
return 0;
}
小结: 在这个算法中遇到了判断闰年。四年一闰,百年不闰,四百年再闰。运用了空间换时间的重要手段——预处理。设定了一个原点时间,本例子为0年1月1日,用cnt保存差值。通过预处理将5000年内每一天与0年1月1日的差值保存到内存中,当用户真正输入数据时,只需要O(1)的时间。
dayOfMonth[month][ isLeapYear(year) ]这个判断设计的很巧妙。
另外,如 int buf[5001][13][32]; 需要开辟大量内存空间时候,定义为全局变量。或者使用malloc等函数动态申请变量空间。 因为如果当这句话写在函数里面,函数可使用的栈空间不足以提供如此大的内存,会出现栈溢出,程序则会异常终止。
PS :我从VS2010里面拷贝代码到word里,注释会变成乱码。为什么(⊙_⊙)。。。。