小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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; }