P8651 [蓝桥杯 2017 省 B] 日期问题---洛谷(题解)

这周周赛的题,我感觉我这题写的还是不错的,用到了上周周赛的口算题中别人题解的函数和最近了解substr还有去年天梯校赛有个日期检验的题,都有用到。

题目描述

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入格式

一个日期,格式是 AA/BB/CC。(0≤�,�,�≤90≤A,B,C≤9)

输出格式

输出若干个不相同的日期,每个日期一行,格式是 yyyy-MM-dd。多个日期按从早到晚排列。

输入输出样例

输入 #1复制

02/03/04

输出 #1复制

2002-03-04  
2004-02-03  
2004-03-02  

想法:

首先是输入,我用了substr把年月日分开,然后分三种情况,年月日,日月年,月日年,分别把他们转换为数字,年的要处理一下,分为20年和19年。然后检验日期的正确性,正确的话就存在结构体数组中,再把数组排序。最后是输出,输出不能重复。我们就先把第一个输出来,然后从第二个开始循环,看当前的和上一个是否相同,不同就输出。这个输出方法还挺好用,我用了挺多次的。结构体也很好用,排序方便。本来我输出想用to_string函数弄成一个string然后整个输出的,但不会排序,就想到用结构体了。

代码:

#include<bits/stdc++.h>
using namespace std;
string a,b,c;
string d;
struct ty{
    int y,m,d;
}ans[5];
int Year(string n){//处理年份
    int num;
    if(n<="59"){
        num=20;
    }
    else num=19;
    for(int i=0;i<n.size();i++) num=num*10+(n[i]-'0');
    return num;
}
int tonum(string n){//字符串转数字
    int num=0;
    for(int i=0;i<n.size();i++) num=num*10+(n[i]-'0');
    return num;
}
int rn(int y){//闰年
    if(y%4==0&&y%100!=0||y%400==0) return 1;
    return 0;
}
int tdate(int yy,int mm,int dd){///检查日期正确性
    if(mm<1||dd<1||mm>12||dd>31) return 0;
    if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12){
        if(dd<=31) return 1;
        else return 0;
    }
    if(mm==4||mm==6||mm==9||mm==11){
        if(dd<=30) return 1;
        else return 0;
    }
    if(rn(yy)){
        if(dd<=29) return 1;
        else return 0;
    }
    else {
        if(dd<=28) return 1;
        else return 0;
    }
}
bool cmp(ty a,ty b){
    if(a.y==b.y&&a.m==b.m) return a.d<b.d;
    if(a.y==b.y) return a.m<b.m ;
    return a.y <b.y ;
}
int main(){
    cin>>d;
    a=d.substr(0,2);
    b=d.substr(3,2);
    c=d.substr(6,2);
    int cnt=0;
    for(int i=0;i<3;i++){
        int y,m,d;
        if(i==0){//年月日 
            y=Year(a);
            m=tonum(b);
            d=tonum(c);
        }
        else if(i==1){
            y=Year(c);
            m=tonum(a);
            d=tonum(b);
        }
        else if(i==2){
            y=Year(c);
            m=tonum(b);
            d=tonum(a);
        }
        if(tdate(y,m,d)){
            ans[cnt++].y=y;
            ans[cnt-1].m=m;
            ans[cnt-1].d=d;
        }
    }
    sort(ans,ans+cnt,cmp);
    printf("%04d-%02d-%02d\n",ans[0].y,ans[0].m,ans[0].d);
    for(int i=1;i<cnt;i++){
        if(ans[i].d!=ans[i-1].d||ans[i].m!=ans[i-1].m||ans[i].y!=ans[i-1].y)
        printf("%04d-%02d-%02d\n",ans[i].y,ans[i].m,ans[i].d);
    }
    return 0;
}

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 20:16:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 20:16:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 20:16:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 20:16:05       18 阅读

热门阅读

  1. 蓝桥杯---列名

    2024-03-10 20:16:05       20 阅读
  2. 【数据结构】栈和队列

    2024-03-10 20:16:05       23 阅读
  3. Ubuntu 20.04 ROS1 与 ROS2 通讯

    2024-03-10 20:16:05       17 阅读
  4. 理工笔记本配置之ubuntu 锐捷认证

    2024-03-10 20:16:05       19 阅读
  5. redis20240306

    2024-03-10 20:16:05       14 阅读
  6. Vue.js 绑定容器

    2024-03-10 20:16:05       20 阅读
  7. 7、Copmose自定义颜色和主题切换

    2024-03-10 20:16:05       20 阅读
  8. SOC设计:关于reset的细节

    2024-03-10 20:16:05       20 阅读
  9. 字符集&字符编码

    2024-03-10 20:16:05       22 阅读
  10. 2024年及未来: AI辅助研发的革新之旅

    2024-03-10 20:16:05       19 阅读