从键盘输入n个日期,输入格式为:月日年 例如:01052023,找出其中距离今天最远的三个日期,请问各位,这个问题有没有更好的解法。
下面是我自己的想法和程序,请各位批评指正。
/*
算法思想:
先把输入的字符串(月日年)通过函数整合为int类型,格式为(年月日)
这样可以直接和今天的日期20201225进行减法运算并取绝对值,绝对值越大,表示距离今天越远。
*/
#include<stdio.h>
#include<math.h>
#include<string.h>
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);
}