C++
#include<stdio.h>
#define runnian(x) x%100!=0&&x%4==0||x%400==0?1:0
int days[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,month,year;
void nextday(){
day++;
if(day>days[month][runnian(year)]){
day=1;
month++;
if(month>12){
month=1;
year++;
}
}
}
};
int buf[5001][13][32];
int Abs(int x) {
return x<0?-x:x;
}
int main(){
int cnt=0;
Date a;
a.day=1;
a.month=1;
a.year=0;
while (a.year<5001){
buf[a.year][a.month][a.day]=cnt;
cnt++;
a.nextday();
}
int y1,m1,d1,y2,m2,d2;
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)在声明中,符号出现在方括号的左边,符号的性质一定是:指代一个数组,即作为数组名。
(2)在声明中,符号出现在圆括号的左边,符号的性质一定是:指代一个函数,即作为函数名。
(3)在声明中,符号出现在星号的右边,符号的性质一定是:它跟右边所构成的整体的其中之元素(在情况(1)下)或返回值(在情况(2)下)是指针,且指针所指向的数据之类型,一定由星号左边的关键字来确定。
本题目要点:
1.求区间的问题:转化为起点确定的区间问题;因此采用预处理,空间换时间;
2.关于日期,注意闰年二月29天;注意逻辑表达式x%100!=0&&x%4==0||x%400==0 ?1:0这个
3.涉及到数组的定义和灵活应用,别忘了初始化的格式,有等号,要给出正确数量的数值,结尾有分号,
4.类的定义,和使用,可以展示日期,且自动计算下一天; 在主函数外定义了类,在主函数内初始化日期;
5.数据本身与数据地址的联系,即三维数组存储天数;
6.%4d
7.耗内存的数组定义为全局变量
8.本题还涉及了宏定义 但是一般用内联函数比宏要性能好 例子如下:
////////////////////////////////////////借用他人博客里的:
计算两个对象的最大值:
#define max(a,b) ((a) > (b) ? (a) : (b))
这个语句有很多缺陷,光想想都让人头疼,甚至比在高峰时间到高速公路去开车还让人痛苦。
无论什么时候你写了象这样的宏,你必须记住在写宏体时对每个参数都要加上括号;否则,别人调用你的宏时如果用了表达式就会造成很大的麻烦。但是即使你象这样做了,还会有象下面这样奇怪的事发生:
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次
这种情况下,max内部发生些什么取决于它比较的是什么值!
幸运的是你不必再忍受这样愚笨的语句了。你可以用普通函数实现宏的效率,再加上可预计的行为和类型安全,这就是内联函数(见条款33):
inline int max(int a, int b) { return a > b ? a : b; }
不过这和上面的宏不大一样,因为这个版本的max只能处理int类型。但模板可以很轻巧地解决这个问题:
template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }
这个模板产生了一整套函数,每个函数拿两个可以转换成同种类型的对象进行比较然后返回较大的(常量)对象的引用。因为不知道T的类型,返回时传递引用可以提高效率(见条款22)。
//////////////////////////////////////////////////////////////////////////////////////////////
题目变型:求特定日子是那年的第几天
解:日期到原点距离 减去当年元旦到原点的距离