#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里,注释会变成乱码。为什么(⊙_⊙)。。。。