• 蓝桥杯 日期问题


    题意:

    问题描述
      小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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
    分析:
    1、先按对应的格式将年份补充完整,若A < 60,一定是2000年后的,否则是1900年后的。
    2、再判断月份是否合法,若合法,再根据该月份看日期是否合法。
    3、注意月份和日期要大于等于1,而且最后合法的年月日要去重。
    #include<cstdio>
    #include<algorithm>
    #include<string>
    #include<cstring>
    #include<sstream>
    #include<cstdlib>
    #include<iostream>
    #include<cmath>
    #include<map>
    #include<set>
    #include<stack>
    #include<vector>
    #include<queue>
    using namespace std;
    const int MAXN = 100 + 10;
    int a, b, c;
    int m1[] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int m2[] = {31,29,31,30,31,30,31,31,30,31,30,31};
    struct Node{
        int y, m, d;
        bool operator < (const Node&rhs)const{
            return y < rhs.y || (y == rhs.y && m < rhs.m) || (y == rhs.y && m == rhs.m && d < rhs.d);
        }
    }num[10];
    set<Node> st;
    int cnt;
    bool judge(int y){
        if(y % 400 == 0) return true;
        if(y % 100 != 0 && y % 4 == 0) return true;
        return false;
    }
    bool judge1(){
        if(a < 60){
            num[cnt].y = 2000 + a;
        }
        else{
            num[cnt].y = 1900 + a;
        }
        if(b < 1 || b > 12) return false;
        if(judge(num[cnt].y)){
            if(c >= 1 && c <= m2[b - 1]){
                num[cnt].m = b;
                num[cnt].d = c;
                return true;
            }
            return false;
        }
        else{
            if(c >= 1 && c <= m1[b - 1]){
                num[cnt].m = b;
                num[cnt].d = c;
                return true;
            }
            return false;
        }
    }
    bool judge2(){
        if(c < 60){
            num[cnt].y = 2000 + c;
        }
        else{
            num[cnt].y = 1900 + c;
        }
        if(a < 1 || a > 12) return false;
        if(judge(num[cnt].y)){
            if(b >= 1 && b <= m2[a - 1]){
                num[cnt].m = a;
                num[cnt].d = b;
                return true;
            }
            return false;
        }
        else{
            if(b >= 1 && b <= m1[a - 1]){
                num[cnt].m = a;
                num[cnt].d = b;
                return true;
            }
            return false;
        }
    }
    bool judge3(){
        if(c < 60){
            num[cnt].y = 2000 + c;
        }
        else{
            num[cnt].y = 1900 + c;
        }
        if(b < 1 || b > 12) return false;
        if(judge(num[cnt].y)){
            if(a >= 1 && a <= m2[b - 1]){
                num[cnt].m = b;
                num[cnt].d = a;
                return true;
            }
            return false;
        }
        else{
            if(a >= 1 && a <= m1[b - 1]){
                num[cnt].m = b;
                num[cnt].d = a;
                return true;
            }
            return false;
        }
    }
    int main(){
        scanf("%d/%d/%d", &a, &b, &c);
        cnt = 0;
        if(judge1()){
            ++cnt;
        }
        if(judge2()){
            ++cnt;
        }
        if(judge3()){
            ++cnt;
        }
        sort(num, num + cnt);
        for(int i = 0; i < cnt; ++i){
            st.insert(num[i]);
        }
        for(set<Node>::iterator it = st.begin(); it != st.end(); ++it){
            printf("%d-%02d-%02d
    ", (*it).y, (*it).m, (*it).d);
        }
        return 0;
    }
    

      

  • 相关阅读:
    相对定位和绝对定位
    一切重新开始
    Oracle Profile 使用
    使用javamail发送邮件错误:550 5.7.1 Unable to relay
    gvim 备份文件去除 配置
    解决Maven中OutOfMemory错误
    sqlplus启动后的环境SQLPATH的设置
    ORA-30004 错误处理
    oracle 锁表查询及解决、表字段查询
    如何进行软件架构设计
  • 原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/8677733.html
Copyright © 2020-2023  润新知