蓝桥杯 日期问题

Posted SomnusMistletoe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯 日期问题相关的知识,希望对你有一定的参考价值。

题意:

问题描述
  小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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\n", (*it).y, (*it).m, (*it).d);
    }
    return 0;
}

  

以上是关于蓝桥杯 日期问题的主要内容,如果未能解决你的问题,请参考以下文章

日期问题 --- 蓝桥杯

蓝桥杯赛前冲刺-枚举暴力和排序专题2(包含历年蓝桥杯真题和AC代码)

蓝桥杯 日期问题

日期类的使用(java)-蓝桥杯

蓝桥杯——根据手册写底层

第八届蓝桥杯 ——日期问题