小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string a[3], B[3], C[3];
int A[3];
int R[12] = { 31,27,31,30,31,30,31,31,30,31,30,31 }; //月份表示
typedef struct node
{
string str;
int sum;
int data;
bool operator < (const node& x) const { //重载比较,按sum值从小到大排列
return sum < x.sum;
}
}DATE[3];
void change(node t); //按平年闰年修改
bool year(node t); //判断年份是平年闰年
bool month(node t); //判断月份是否符合
bool day(node t, node t1, node t2); //判断天数是否符合
void output(int a, string b, string c, int n);
int main()
{
DATE q;
string s;
cin >> s;
for (int i = 0; i < 3; i++)
{
q[i].str = a[i] = s.substr(i * 3, 2); //节选年月日
q[i].data = i; //位置标识符,用来去除不适合的位置
q[i].sum = (s[i * 3] - '0') * 10 + (s[i * 3 + 1] - '0'); //字符数字化
}
sort(q, q + 3); //重载后的排序
int c, k = 0;
for (int a = 0; a < 3; a++)
for (int b = 0; b < 3; b++)
{
c = 3 - a - b;
if (b != a && month(q[b]) && day(q[a], q[b], q[c])) //遍历,去除不符合的情况
output(q[a].sum, q[b].str, q[c].str, k++); //排除重复的情况
}
return 0;
}
void change(node t)
{
if (year(t))
R[1] = 29;
else
R[1] = 28;
}
bool year(node t)
{
int y;
if (t.sum < 60)
y = 2000 + t.sum;
else
y = 1900 + t.sum;
return (y % 4 == 0 && y % 100 != 0 || y % 400 == 0);
}
bool month(node t)
{
return(t.sum <= 12 && t.data != 2);
}
bool day(node t, node t1, node t2)
{
change(t);
return (t.data != 1 && t2.sum <= R[t1.sum - 1] && t2.sum > 0);
}
void output(int a, string b, string c, int n)
{
A[n] = a; B[n] = b; C[n] = c;
for (int i = 0; i < n; i++)
if (a == A[i] && b == B[i] && c == C[i]) //去重
return;
if (a < 60) a = a + 2000;
else a = a + 1900;
cout << a << "-" << b << "-" << c << endl;
}