日期问题【枚举】
题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 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)。
输出描述
输出若干个不相同的日期,每个日期一行,格式是 “yy−MM−dd”。多个日期按从早到晚排列。
输入输出样例
示例
输入
02/03/04
输出
2002-03-04
2004-02-03
2004-03-02
思路:
这道提的思路并不难,题目上说年月日的日期顺序可能不对,日期从小到大输出存在的可能,题目上说有采用年/月/日的,
有采用月/日/年的,还有采用日/月/年的,但答案却不是按这样说的。应该是有的采用年/月/日、采用日/年/月、采用日/月/年
我定义一个函数,把这三种顺序分别带进函数,判断是不是合法的日期,如果是存进结构体数组,用结构体数组方便日期排序和
判断日期是不是重复。
日期合法应该是满足以下条件:
- 年:按题意,后两位大于等于60属于20世纪,否则属于21世纪
- 月:在1月到12月之间
- 日:先判断是不是闰年,接着判断该月份有多少天,最后把该月份最大天数与输入的月份比较,输入的月份要小于最大天数
且日必须大于0满足以上条件为合法日期,存进结构体数组,但要判断结构体数组是否存在相同日期,如果没有则存进。
存进数组后对数组进行排序,最后输出日期
代码:
#include<bits/stdc++.h>
using namespace std;
struct date
{ //定义一个结构体,存放合法日期,方便排序
int year;
int month;
int day;
}que[4];
int s=0; //用于结构体的序号
int cmp(date x,date y); //比较函数sort的参数,定义了怎样排序
int judge_year(int year); //用于判断是不是闰年
int judge_date(int year,int month,int day); //判断日期是不是合法
void judge(int year,int month,int day); //主要调用上面函数,把合法日期存进数组
int main()
{
int a,b,c;
scanf("%d/%d/%d",&a,&b,&c);
judge(a,b,c); //分别把日期换位置,看是否合法
judge(c,a,b);
judge(c,b,a);
sort(que,que+s,cmp); //把合法日期进行排序
for(int i=0;i<s;i++) //输出合法日期
printf("%d-%02d-%02d\n",que[i].year,que[i].month,que[i].day);
return 0;
}
void judge(int year,int month,int day)
{ //判断函数
int flag=1; //标记日期是否重复
if(year<60) //如果小于60,由题意知为20世纪
year=year+2000;
else year=year+1900; //否则为21世纪
if(judge_date(year,month,day))
{ //如果日期合法
for(int i=0;i<s;i++)
{ //判断结构体中是否已经存在相同的日期
if(que[i].day==day&&que[i].month==month&&que[i].year==year)
{
flag=0;
break;
}
}
if(flag)
{ //如果没有相同的日期就存进结构体中
que[s].year=year;
que[s].month=month;
que[s].day=day;
s++;
}
}
}
int judge_date(int year,int month,int day)
{ //判断日期是否合法
int sum;
switch(month)
{ //判断输入的月份一共有多少天,和输入的天数比较
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
sum=31;
break;
case 4:case 6: case 9: case 11:
sum=30;
break;
case 2:
sum=28;
break;
}
if(month==2&&judge_year(year))
sum=29;
if(sum>=day&&day>0&&month>=1&&month<=12)
return 1; //如果天数小于该月总天数,且大于0,月份也在1~12,则合法
return 0;
}
int judge_year(int year)
{ //判断是否闰年
if(year%4==0&&year%100!=0||year%400==0)
return 1;
return 0;
}
int cmp(date x,date y)
{ //比较函数
if(x.year<y.year) //年份按递增排序
return 1;
else if(x.year==y.year)
{ //如年份相同,比较月份
if(x.month<y.month)
return 1;
else if(x.month==y.month)
{ //如月份相同,比较天数
if(x.day<y.day)
return 1;
}
}
return 0;
}