蓝桥杯 - 历届试题 - 日期问题

蓝桥杯历届试题——日期问题

试题原题

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

//判断 year 是否是闰年
//默认 year已经是大于零的数 
bool isLeapYear(int year)
{
    if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) return true; 
    return false;
}

//对传来的3个参数是否能构成一个日期  yy-mm-dd 
//规定:
//     yy∈[00,59]  yy = 20yy
//     yy∈[60,99]  yy = 19yy
//     即yy无需判断,默认合法,但某种情况下需要判断yy是闰年/平年。 
//     mm∈[01,12]  否则不合法 
//     dd∈[01,31]  否则不合法 
//        特别地:
//               dd∈[29,31]  需要根据月份、闰年/平年进行讨论 
bool isLegal (int yy, int mm, int dd)
{
    if(mm > 12 || mm <= 0) return false;  // 月份不合法
    if(dd >31 || dd <= 0) return false;   // 日期不合法
    if(dd <29) return true;    // 日期小于29,必定合法
    else
    {
        // dd 为31的情况下, 2,4,6,9,11月是不可能的 
        if(dd == 31 && (mm == 2 || mm == 4 || mm == 6|| mm ==9 || mm == 11)) return false; 
        // dd 为30的情况下,2月是不可能的 
        if(dd == 30 && mm == 2) return false;
        // dd 为29的情况下,2月的平年是不可能的
        if(dd == 29 && mm == 2) 
        {
            int year = (yy < 60)? 2000 + yy : 1900 + yy;
            if(!(isLeapYear(year))) return false;
        }
    } 
    return true;
}

struct Date
{
    int date[3]; // 0-yy; 1-mm; 2-dd
    bool operator < (const struct Date dt) const
    {
        for(int i = 0; i < 3; i++)
        {
            if(date[i] > dt.date[i]) return false;
            else if(date[i] < dt.date[i]) return true;
        }
        return false;
    }
}legalDate[3];  

int sum = 0; //记录实际共有几个合法的日期 

//把合法的日期加入legalDate 
void addLegalDate(int y, int m, int d)
{
    int year = (y < 60)? 2000 + y : 1900 + y;
    for(int i = 0; i < sum; i++)
    {
        //避免出现重复的日期 
        if(legalDate[i].date[0] == year && legalDate[i].date[1] == m && legalDate[i].date[2] == d)
            return;
    }
    legalDate[sum].date[0] = year;
    legalDate[sum].date[1] = m;
    legalDate[sum].date[2] = d;
    sum++;
}


int main() 
{
    int date[3];    
    scanf("%d/%d/%d", &date[0], &date[1], &date[2]);    
    //穷举3种可能的情况     
    // 年/月/日 
    if(isLegal(date[0], date[1], date[2]))
    {
        addLegalDate(date[0], date[1], date[2]);
    }

    // 月/日/年 
    if(isLegal(date[2], date[0], date[1]))
    {
        addLegalDate(date[2], date[0], date[1]);
    }

    // 日/月/年 
    if(isLegal(date[2], date[1], date[0]))
    {
        addLegalDate(date[2], date[1], date[0]);
    }

    //按日期先后排序 
    sort(legalDate, legalDate + sum);

    for(int i = 0; i < sum; i++)
    {
        printf("%d-%02d-%02d\n", legalDate[i].date[0], legalDate[i].date[1], legalDate[i].date[2]);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值