0
点赞
收藏
分享

微信扫一扫

【思特奇杯·云上蓝桥-算法集训营】第1周 日期问题

天天天蓝loveyou 2022-01-08 阅读 84

小明正在整理一批历史文献。这些历史文献中出现了很多日期。

小明知道这些日 期都在 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

资源约定: 峰值内存消耗(含虚拟机) < 256M

CPU 消耗 < 1000ms

这个题不算难,主要就是一个写起来可能比较多。

需要注意的就是一个归类问题。还有一个日期排序问题。

具体代码如下:

#include <iostream>
#include <set>
using namespace std;
struct date1{
    int year;
    int month;
    int day;
    bool operator < (date1 other)const{
        if(year == other.year)
        {    
            if(month == other.month)
                return day<other.day;       
            
            return month<other.month;
        }
        
            return year<other.year;
    }

}d[3];

int main()
{   
    set<date1> h;  // 引用集合是为了排序查重。
    date1 check(int year,int month,int day);
    int a=0,b=0,c=0;
    
    scanf("%d/%d/%d",&a,&b,&c);

    d[0]=check(a,b,c);
    d[1]=check(c,a,b);
    d[2]=check(c,b,a);
    
    for(int i=0;i<3;i++)
    {
        if(d[i].year!=0)
            h.insert(d[i]);
    }
 
    for(set<date1>::iterator it = h.begin();it != h.end();it++)
       printf("%d-%02d-%02d\n",it->year,it->month,it->day);
    
    
    return 0;
}
date1 check(int year,int month,int day)
{   
    date1 a={0};  // 注意先不急着给a赋值,等检测完后,在进行赋值。同时为了后续判断直接先归0.
    if(year<=59)
        year=year+2000;
    else
        year=year+1900;
    
    if(month==1 || month==3 ||month==5 ||month==7 ||month==8 || month==10||month==12)
    {
        if(day>31 || day==0)
            return a;
    }
    else if(month==4 || month==6||month==9||month==11)
    {
        if(day>30 || day==0)
            return a;
    }
    else if(month==2)
    {
        if(year%4==0&&year%100!=0||year%400==0) // 如果是个闰年
        {
            if(day>29 || day==0)
                return a;
        }
        else
        {
            if(day>28 ||day==0)
                return a;
        }
    }
    else
        return a;
    
    // 判断完成后再进行赋值。
    a.year=year;
    a.month=month;
    a.day=day;

    return a;
}

举报

相关推荐

0 条评论