日期类问题(1)

日期类问题:

 

题目描述:

    对输入的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;
}


注明---该博客为本人王道的学习笔记记录,博客中有些总结是从王道机试中摘抄下来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值