- 日期类问题:
- 题目描述:
-
对输入的n个数进行排序并输出。
- 输入:
-
输入的第一行包括一个整数n(1<=n<=100)。
接下来的一行包括n个整数。
- 输出:
-
可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。
每组测试数据的结果占一行。
- 样例输入:
-
4 1 4 3 2
- 样例输出:
-
1 2 3 4
日期类问题
1)解决这类问题的统一思想:把原区间问题统一到起点确定的区间问题上去(此处假设原点时间为00000101)
这样做的好处:预处理,在程序真正运行之前把所有日期与原点日期的天数差保存起来,当数据真正开始输入时,用O(1)的时间复杂度将保存的数据读出,稍加处理便能得到答案。预处理是时间换空间的重要手段。
2)本程序需要注意的三个问题:
Hash思想的应用---把数据和存储数据的地址联系起来
scanf中%4d--取八位输入数字的前4位
int days[5001][13][32]定义为全局变量的原因
---具体说明在程序中有详细注释
#include <stdio.h>
//定义宏处理闰年的情况
#define ISRUN(x) (x%100!=0&&x%4==0||x%400==0)?1:0
//定义全局数组--存储每个月的天数--该数组要是二维的--考虑闰年二月29天的情况
int monthDays[13][2]=
{0,0,
31,31,//1
28,29,
31,31,//3
30,30,
31,31,//5
30,30,
31,31,//7
31,31,//8
30,30,
31,31,//10
30,30,
31,31//12
};
int days[5001][13][32]={0};// 年 月 日
//将数据本身与数据的存储地址联系起来,这是Hash的基本思想
//把这个比较耗费内存的数组定义成全局变量的原因:
//若把它定义在main函数中,该函数不足以提供如此庞大的内存很可能会导致栈溢出,使程序异常终止
//所以小编建议--若今后涉及开辟大量存储空间的情况,最好定义在函数外--全局变量
//或使用malloc进行动态分配
struct Date
{
int year;
int month;
int day;
void NextDay()
{
day++;
if(day > monthDays[month][ISRUN(year)] ){
day = 1;
month ++;
if(month > 12){
month = 1;
year++;
}
}
}
};
int Abs(int num)
{
if(num <0)
return -num;
return num;
}
int main()
{
Date temp;
Date date1,date2;
temp.year = 0;
temp.month = 1;
temp.day = 1;
int count = 0;
while(temp.year != 5001){
days[temp.year][temp.month][temp.day] = count;
temp.NextDay();
count++;
}
//2014/3/11
//第一次提交一直抱WS,郁闷逻辑没有问题啊---后来才发现前一天写的时候没有加while循环--题目中说了可能有多组测试数据
//一定要注意输入输出---这是犯错最多的地方
//注意一下读入语句,使用%4d来取8位数的前四位,依次类比
while(scanf("%4d%2d%2d",&date1.year,&date1.month,&date1.day) != EOF){
scanf("%4d%2d%2d",&date2.year,&date2.month,&date2.day);
printf("%d\n",Abs(days[date1.year][date1.month][date1.day]-days[date2.year][date2.month][date2.day])+1);
}
return 0;
}
注明---该博客为本人王道的学习笔记记录,博客中有些总结是从王道机试中摘抄下来的。