小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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
解题思路:
1.首先判断当前所组成的年月日是否合理(年份,月份,天数是都在合理范围内,特别地要考虑闰年平年(2月的天数问题));
2.若合理的话则将它放入结构体数组中;
3.最后将结构体数组按照年份,月份天数从小到大排序。
源码附上:
#include <bits/stdc++.h>
using namespace std;
int days[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
struct Date
{
int year,month,day;
Date(int year=0,int month=0,int day=0):year(year), month(month),day(day){}
void printDate() const
{
printf("%d-%02d-%02d\n", year, month, day);
}
};
Date A[3];
int amount=0;
bool cmp(Date d1,Date d2)
{
if(d1.year=d2.year)
{
if(d1.month=d2.month)
{
return d1.day<d2.day;
}
return d1.month<d2.month;
}
return d1.year<d2.year;
}
bool isleap(int year)
{
return (year%4==0&&year%100!=0||year%400==0);
}
int judge(int year,int month,int day)
{
if(year<1960||year>2059||month>12||month<1||day>days[month])
return false;
if(isleap(year)&&month==2)
{
if(day>29)
return false;
}
else if(!isleap(year)&&month==2)
{
if(day>28)
return false;
}
return true;
}
void vaild(int year,int month,int day)
{
//判断该日期是否有效
if(judge(year,month,day))
{
Date dd(year,month,day);
A[amount++]=dd;
}
}
int main()
{
int a,b,c;
char c1,c2;
cin>>a>>c1>>b>>c2>>c;
vaild(1900+a,b,c);
vaild(2000+a,b,c);
vaild(1900+c,a,b);
vaild(2000+c,a,b);
vaild(1900+c,b,a);
vaild(2000+c,b,a);
sort(A,A+amount,cmp);
for(int i=0;i<amount;i++)
{
printf("%d-%02d-%02d\n",A[i].year,A[i].month,A[i].day);
}
return 0;
}
参考博客: