从键盘输入n个日期,输入格式为:月日年 例如:01052023,找出其中距离今天最远的三个日期,请问各位,这个问题有没有更好的解法。
下面是我自己的想法和程序,请各位批评指正。
/*
算法思想:
先把输入的字符串(月日年)通过函数整合为int类型,格式为(年月日)
这样可以直接和今天的日期20201225进行减法运算并取绝对值,绝对值越大,表示距离今天越远。
*/
#include
#include
#include
int fun(char *p)
{//返回整合后日期与20201225的差值
int i=4;
int data=0;
while(i<8)
data=data*10+p[i++]-'0';
i=0;
while(i<4)
data=data*10+p[i++]-'0';
return abs(data-20201225);
}
void swap(char *p,char *q)
{
char str[10];
strcpy(str,p);
strcpy(p,q);
strcpy(q,str);
}
void main()
{
char max1[10],max2[10],max3[10];//按差值大小依次存放距离今天最远的三个日期
char data[10]; //存放输入的日期
int n; //输入日期的个数
scanf("%d",&n);
getchar(); //接收输入缓冲区的换行符
gets(max1);gets(max2);gets(max3); //获取前三个输入的日期
//三个if调整顺序,max1中日期最远,2和3依次
if(fun(max1)<fun(max2))
swap(max1,max2);
if(fun(max1)<fun(max3))
swap(max1,max3);
if(fun(max2)<fun(max3))
swap(max2,max3);
for(int i=4;i<=n;i++)
{
gets(data);
if(fun(data)>fun(max1))
{
strcpy(max3,max2);
strcpy(max2,max1);
strcpy(max1,data);
}
else if(fun(data)>fun(max2))
{
strcpy(max3,max2);
strcpy(max2,data);
}
else if(fun(data)>fun(max3))
strcpy(max3,data);
}
puts(max1);puts(max2);puts(max3);
}
这个程序的思路是正确的。但是在实现方面,可以考虑以下几点优化:
1、使用 sscanf 函数,而不是手写的 fun 函数,把输入的字符串转化为整数:
int data;
sscanf(p, "%2d%2d%4d", &month, &day, &year);
data = year * 10000 + month * 100 + day;
return abs(data - 20201225);
2、使用结构体存储每个日期及其差值,而不是使用字符串和临时变量。这样可以减少代码量,同时提高程序的可读性。
3、使用快速排序函数,而不是手写的 swap 函数,对日期进行排序。
仅供参考,望采纳,谢谢。
各位如果还有更好的解法,欢迎补充!