(未完成的)日期问题
问题描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
比如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
2004-02-03
2004-03-02
数据规模和约定
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
CPU消耗 < 1000ms
Algorithm
遇到这种题,我内心是拒绝的~~~
考虑了大部分情况,还是有些特殊数据没有处理好,先放一放了!
未完成的AC
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 #include<cstdio> 5 6 using namespace std; 7 8 bool isLeap(int year) 9 { 10 return ((year%4 == 0 && year%100 != 0) || (year%400 == 0)); 11 } 12 13 void solve(int x, int y, int z) 14 { 15 if(x>31) 16 printf("20%02d-%02d-%02d\n", x, y, z); 17 else if(x == 0 || z == 0){// 情况复杂....... 18 if(x==0) 19 printf("20%02d-%02d-%02d\n", x, y, z); 20 else{ 21 int a=x>y?x:y; 22 int b=x<y?x:y; 23 if(a!=b){ 24 printf("20%02d-%02d-%02d\n", z, b, a); 25 printf("20%02d-%02d-%02d\n", z, a, b); 26 } 27 else 28 printf("20%02d-%02d-%02d\n", z, x, x); 29 } 30 } 31 else if(z>31){ // 日月年 或 月日年 32 if(x>12){ // 日月年 33 printf("20%02d-%02d-%02d\n", z, y, x); 34 } 35 else if(y>12){ //月日年 36 printf("20%02d-%02d-%02d\n", z, x, y); 37 } 38 else{ 39 int a=x>y?x:y; 40 int b=x<y?x:y; 41 if(b==a){ 42 printf("20%02d-%02d-%02d\n", z, b, a); 43 } 44 else{ 45 printf("20%02d-%02d-%02d\n", z, b, a); 46 printf("20%02d-%02d-%02d\n", z, a, b); 47 } 48 49 } 50 } 51 else if(x>12){ // 日月年 52 printf("20%02d-%02d-%02d\n", z, y, x); 53 } 54 else if(x<=12){ // 三种 55 if(y>12){ // 56 printf("20%02d-%02d-%02d\n", z, x, y); 57 } 58 else if(x != 2 || y != 2){ // 先排除 2 月 59 int a[3];a[0]=x;a[1]=y;a[2]=z; 60 sort(a, a+3); 61 if(x=y=z) 62 printf("20%02d-%02d-%02d\n", x, y, z); 63 return; 64 if(x == y){ 65 printf("20%02d-%02d-%02d\n", x, y, z); 66 printf("20%02d-%02d-%02d\n", z, x, y); 67 return; 68 } 69 if(x == z){ 70 printf("20%02d-%02d-%02d\n", x, y, z); 71 printf("20%02d-%02d-%02d\n", x, z, y); 72 return; 73 } 74 printf("20%02d-%02d-%02d\n", a[0], a[1], a[2]); 75 printf("20%02d-%02d-%02d\n", a[2], a[0], a[1]); 76 printf("20%02d-%02d-%02d\n", a[2], a[1], a[0]); 77 } 78 else{ // 考虑闰年和平年的条件 79 if(!isLeap(2000+x) && z == 29){ // 如果是闰年 80 printf("20%02d-%02d-%02d\n", z, x, y); 81 } 82 else{ 83 printf("20%02d-%02d-%02d\n", z, x, y); 84 printf("20%02d-%02d-%02d\n", x, y, z); 85 } 86 } 87 } 88 89 } 90 91 int main() 92 { 93 string t; 94 cin>>t; 95 int x, y, z; 96 // 02/03/04 97 x = int(t.at(0)-'0')*10 + int(t.at(1)-'0'); 98 y = int(t.at(3)-'0')*10 + int(t.at(4)-'0'); 99 z = int(t.at(6)-'0')*10 + int(t.at(7)-'0'); 100 // 年 / 月 /日 101 // 月 / 日 /年 102 // 日 / 月 /年 103 solve(x, y, z); 104 // printf("20%02d-%02d-%02d\n", x, y, z); 105 106 return 0; 107 }