小明正在整理一批历史文献。这些历史文献中出现了很多日期。
小明知道这些日 期都在 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
资源约定: 峰值内存消耗(含虚拟机) < 256M
CPU 消耗 < 1000ms
这个题不算难,主要就是一个写起来可能比较多。
需要注意的就是一个归类问题。还有一个日期排序问题。
具体代码如下:
#include <iostream>
#include <set>
using namespace std;
struct date1{
int year;
int month;
int day;
bool operator < (date1 other)const{
if(year == other.year)
{
if(month == other.month)
return day<other.day;
return month<other.month;
}
return year<other.year;
}
}d[3];
int main()
{
set<date1> h; // 引用集合是为了排序查重。
date1 check(int year,int month,int day);
int a=0,b=0,c=0;
scanf("%d/%d/%d",&a,&b,&c);
d[0]=check(a,b,c);
d[1]=check(c,a,b);
d[2]=check(c,b,a);
for(int i=0;i<3;i++)
{
if(d[i].year!=0)
h.insert(d[i]);
}
for(set<date1>::iterator it = h.begin();it != h.end();it++)
printf("%d-%02d-%02d\n",it->year,it->month,it->day);
return 0;
}
date1 check(int year,int month,int day)
{
date1 a={0}; // 注意先不急着给a赋值,等检测完后,在进行赋值。同时为了后续判断直接先归0.
if(year<=59)
year=year+2000;
else
year=year+1900;
if(month==1 || month==3 ||month==5 ||month==7 ||month==8 || month==10||month==12)
{
if(day>31 || day==0)
return a;
}
else if(month==4 || month==6||month==9||month==11)
{
if(day>30 || day==0)
return a;
}
else if(month==2)
{
if(year%4==0&&year%100!=0||year%400==0) // 如果是个闰年
{
if(day>29 || day==0)
return a;
}
else
{
if(day>28 ||day==0)
return a;
}
}
else
return a;
// 判断完成后再进行赋值。
a.year=year;
a.month=month;
a.day=day;
return a;
}