(未完成的)日期问题

问题描述

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

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 }
View Code

 

 
posted @ 2018-11-19 12:38  maybeTang  阅读(301)  评论(0编辑  收藏  举报