题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入描述
一个日期,格式是 “AA/BB/CC” (0≤A, B, C ≤ 9)。
输出描述
输出若干个不相同的日期,每个日期一行,格式是 “yyyy-MM-dd”。多个日期按从早到晚排列。
示例
输入 |
---|
02/03/04 |
输出 |
---|
2002-03-04 |
2004-02-03 |
2004-03-02 |
运行限制
最大运行时间:1s
最大运行内存: 256M
代码
#include<stdio.h>
typedef struct
{
int year;
int month;
int day;
} Date;
int isLeap(int y) //判断是否为闰年
{
return (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0));
}
int judge(int year,int month,int day) //判断输入的三个数是否是合法的年月日
{
int leap=isLeap(year);
if(month==2)
{
if(leap) //闰年的2月天数条件
{
if(day<=29)
return 1;
else
return 0;
}
else //平年的2月天数条件
{
if(day<=28)
return 1;
else
return 0;
}
}
else //非2月天数需要满足的条件30/31
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //31天条件
{
if(day<=31)
return 1;
else
return 0;
}
else if(month==4||month==6||month==9||month==11) //30天条件
{
if(day<=30)
return 1;
else
return 0;
}
else //月份不满足条件
{
return 0;
}
}
}
void swap(Date *date1,Date *date2)
{
Date tmp;
tmp = *date1;
*date1 = *date2;
*date2 = tmp;
}
void date_sort(Date date[],int n)
{
for(int i=0; i<=n; i++) //冒泡排序法排序日期
for(int j=0; j<n-i; j++)
{
if(date[j].year>date[j+1].year) //优先排序年份
{
swap(&date[j],&date[j+1]);
}
else if(date[j].year==date[j+1].year)
{
if(date[j].month>date[j+1].month) //年份相同排序月份
{
swap(&date[j],&date[j+1]);
}
else if(date[j].month==date[j+1].month)
{
if(date[j].day>date[j+1].day) //年份月份相同排序天数
{
swap(&date[j],&date[j+1]);
}
}
}
}
}
void print_date(Date date[],int n)
{
for(int i=0; i<=n; i++)
{
printf("%d-",date[i].year); //输出年份
if(date[i].month<=9)
printf("0%d-",date[i].month); //输出月份
else
printf("%d-",date[i].month);
if(date[i].day<=9)
printf("0%d\n",date[i].day); //输出天数
else
printf("%d\n",date[i].day);
}
}
int main()
{
Date date[3];
int AA,BB,CC,year_real;
int n=0;
scanf("%d%d%d",&AA,&BB,&CC); //输入AA/BB/CC
if(AA<60) //判断年(AA)月(BB)日(CC)表示的合理性
year_real=2000+AA;
else
year_real=1900+AA;
if(judge(year_real,BB,CC))
{
date[n].year=year_real;
date[n].month=BB;
date[n].day=CC;
n++;
}
if(CC<60) //判断月(AA)日(BB)年(CC)表示的合理性
year_real=2000+CC;
else
year_real=1900+CC;
if(judge(year_real,AA,BB))
{
date[n].year=year_real;
date[n].month=AA;
date[n].day=BB;
n++;
}
//判断日(AA)月(BB)年(CC)表示的合理性
if(judge(year_real,BB,AA))
{
date[n].year=year_real;
date[n].month=BB;
date[n].day=AA;
n++; //符合条件都加一,减一后即为index
}
date_sort(date,n-1); //排序日期
print_date(date,n-1); //输出日期
return 0;
}