【九度】题目1096:日期差值

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:10974

解决:3670

题目描述:

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天

输入:

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出:

每组数据输出一行,即日期差值

样例输入:
20110412
20110422
样例输出:
11			
#include "stdafx.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){
		Month=1;
		Year++;
	}
	}
}
};
int buf[50001][13][32];
int Abs(int x){
	return x<0?-x:x;
}

int _tmain()
{
	Date tmp;
	int cnt=0;
	tmp.Day=1;
	tmp.Month=1;
	tmp.Year=0;   //初始化日期类对象为0年1月1日
	while (tmp.Year!=5001)
	{
		buf[tmp.Year][tmp.Month][tmp.Day]=cnt; //将该日与0年1月1日的天数差保存起来。
	    tmp.nextDay();                                           //计算下一天日期
	    cnt++;                                                       //计数器累加,每经过一天计数器即+1,代表与原点日期的间隔又增加一天
	}
	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);
	}
	return 0;
}




1、保存每个日期与原点日期的天数差时,使用三维数组,用年月日来表示数组下标,不必寻找其存储地址,是HASH的基本思想。
2、%2d形式,读取两位。读取特定位数的技巧。
3、将buf[5001][13][32]这个比较费内存的数组定义为全局变量,如若不然,函数栈空间不足以提供如此大的内存,出现栈溢出。涉及此类需要开辟大空间的情况,需要在函数体外定义。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值