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

				版权声明:本文为博主原创文章,未经博主允许不得转载。					https://blog.csdn.net/qq_33531813/article/details/79516258				</div>
							            <div id="content_views" class="markdown_views">
						<!-- flowchart 箭头图标 勿删 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<h2 id="蓝桥杯历届试题日期问题">蓝桥杯历届试题——日期问题</h2>

试题原题

#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;
}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-258a4616f7.css" rel="stylesheet">
            </div>
				版权声明:本文为博主原创文章,未经博主允许不得转载。					https://blog.csdn.net/qq_33531813/article/details/79516258				</div>
							            <div id="content_views" class="markdown_views">
						<!-- flowchart 箭头图标 勿删 -->
						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<h2 id="蓝桥杯历届试题日期问题">蓝桥杯历届试题——日期问题</h2>

猜你喜欢

转载自blog.csdn.net/weixin_40975029/article/details/88770496
今日推荐