蓝桥杯 日期问题

题意:

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

  

转载于:https://www.cnblogs.com/tyty-Somnuspoppy/p/8677733.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值