【王道九度OJ】1061日期差值

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

小结:  在这个算法中遇到了判断闰年。四年一闰,百年不闰,四百年再闰。运用了空间换时间的重要手段——预处理。设定了一个原点时间,本例子为011日,用cnt保存差值。通过预处理将5000年内每一天与011日的差值保存到内存中,当用户真正输入数据时,只需要O1)的时间。

 dayOfMonth[month][ isLeapYear(year) ]这个判断设计的很巧妙。

另外,如  int buf[5001][13][32]; 需要开辟大量内存空间时候,定义为全局变量。或者使用malloc等函数动态申请变量空间。  因为如果当这句话写在函数里面,函数可使用的栈空间不足以提供如此大的内存,会出现栈溢出,程序则会异常终止。

 

 

PS  我从VS2010里面拷贝代码到word里,注释会变成乱码。为什么(_)。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值