zoukankan      html  css  js  c++  java
  • [蓝桥杯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
    ",p[i].y,p[i].m,p[i].d);
        }
        return 0;
    }
  • 相关阅读:
    nyoj-68-三点顺序-计算几何
    zoj--1089--Lotto---DFS VS 暴力求解
    zoj----1090---The Circumference of the Circle---数学几何
    nyoj-阶乘0
    nyoj-回文字符串--动态规划
    nyoj-最长公共子序列---动态规划
    hdu-1285确定比赛名次---拓扑排序
    等式数量---hash算法
    学生学籍管理系统
    2020.2.9 解决Zabbix agent is not available&windows下安装zabbix-agent 主机部署监控
  • 原文地址:https://www.cnblogs.com/-citywall123/p/12333019.html
Copyright © 2011-2022 走看看