[蓝桥杯2017初赛]日期问题

 题目描述

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

题解:题目不难,就是很烦 ~v~

因为输入有三种形式,年/月/日    ,月/日/年    ,日/月/年,三种形式的日期逐个判断是否合法既可以,最后对日期从小到大排序

注意两个比较特殊的数据:

1、当年的位置是 00 的时候

2、当三个参数相同的时候,要注意去重,比如01/01/01的输出只有一个

#include<iostream>
#include<string>
#include<algorithm>
#include<math.h>
using namespace  std;
int t=0;

struct node 
{
    int y,m,d;
}p[120];

int find(int x)
{
    if(x%4==0&&x%100!=0||x%400==0)
        return 1;
    else
        return 0;
}
bool cmp(node a,node b)
{
    if(a.y!=b.y)
        return a.y<b.y;
    else
    {
        if(a.m!=b.m)
            return a.m<b.m;
        else
            a.d<b.d;
    }
}

void check(int yy,int mm,int dd)
{
    int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    if(yy>=60)
        yy=1900+yy;
    else 
        yy=2000+yy;

    if(find(yy)==1)//判断闰年
        day[2]++;

    if(mm>0&&mm<=12)
    {
        if(dd>0&&dd<=day[mm])
        {
            p[t].y=yy;
            p[t].m=mm;
            p[t++].d=dd;
        }
    }
}
int main()
{
    string s;
    cin>>s;

    int x1=(s[0]-'0')*10+(s[1]-'0');
    int x2=(s[3]-'0')*10+(s[4]-'0');
    int x3=(s[6]-'0')*10+(s[7]-'0');

    //  x1/x2/x3  输入的三种可能形式都输进去判断一遍
    check(x1,x2,x3);//年/月/日
    check(x3,x1,x2);//月/日/年
    check(x3,x2,x1);//日/月/年
    //check(年,月,日)

    sort(p,p+t,cmp);
    for(int i=0;i<t;i++)//输出的时候还要去除重复的日期,比如 s=01/01/01 只有一种情况
    {
        if(i>0&&p[i].y==p[i-1].y&&p[i].m==p[i-1].m&&p[i].d==p[i-1].d)
            continue;
        printf("%d-%02d-%02d\n",p[i].y,p[i].m,p[i].d);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/-citywall123/p/12333019.html
今日推荐