• 日期问题(蓝桥杯)


    日期问题

    题目描述

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

    输出

    2002-03-04
    2004-02-03
    2004-03-02
    
    • 1
    • 2
    • 3

    暴力枚举

    // 包含C++标准库,用于输入输出
    #include
    using namespace std;
    
    // 定义一个数组存储非闰年中每个月的天数
    int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    
    // 定义一个检查函数,用于判断给定的年、月、日是否构成一个有效的日期
    bool check(int year,int month,int day)
    {
        // 如果月份不在1到12之间,返回false
        if(month<=0||month>12) return false;
        // 如果日期小于或等于0,返回false
        if(day<=0) return false;
        // 如果月份不是2月
        if(month!=2)    
        {
            // 如果日期大于该月的最大天数,返回false
            if(day>months[month]) return false;
        }
        else//对于2月
        {
            // 如果是闰年
            if(year%4==0&&year%100!=0||year%400==0)
            {
                // 如果日期大于29,返回false
                if(day>29) return false;
            }
            else
            {
                // 如果不是闰年且日期大于28,返回false
                if(day>28) return false;
            }
        }
        // 如果所有检查都通过了,返回true
        return true;
    }
    
    // main函数,程序的入口
    int main()
    {
        int a,b,c;
        // 读取输入的日期,格式为AA/BB/CC
        scanf("%02d/%02d/%02d",&a,&b,&c);//年月日
        // 遍历从1960年1月1日到2059年12月31日的所有日期
        for(int i=19600101;i<=20591231;i++)
        {
            // 从遍历的日期i中分离出年、月、日
            int year=i/10000,month=i/100%100,day=i%100;
            // 使用check函数检查日期是否有效
            if(check(year,month,day))
            {
                // 检查日期是否符合输入的格式之一
                if(year%100==a&&month==b&&day==c //年月日
                ||year%100==c&&month==a&&day==b //日年月
                ||year%100==c&&month==b&&day==a)//日月年
                // 如果符合,以yyyy-MM-dd的格式输出日期
                printf("%d-%02d-%02d\n",year,month,day);
            }
        }
        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

    程序的逻辑是这样的:

    1. 首先,定义了一个月份天数的数组,这对于检查一个日期是否有效非常重要,特别是对于2月份,因为它的天数与是否为闰年有关。

    2. 然后,定义了一个check函数,这个函数用于验证给定的年月日是否构成一个合法的日期。它会检查月份和日期的合法性,对于2月还会额外检查闰年的情况。

    3. main函数是程序的主体,它首先读入一个日期,然后遍历所有可能的年份(从1960年到2059年),对于每一个年份,它会使用check函数来验证日期的有效性。

    4. 如果日期有效,程序进一步检查这个日期是否与输入的日期格式相匹配。因为输入的年份省略了前两位数字,所以需要检查所有可能的年份表示方法。

    5. 最后,如果一个日期既有效又与输入匹配,程序就会按照"yyyy-MM-dd"的格式输出这个日期。

  • 相关阅读:
    Pulsar Meetup 深圳 2024 会务介绍
    Android studio连接MySQL并完成简单的登录注册功能
    生产环境调试APNS的方式(测试同学说线上APP突然接收不到通知了。)
    【从零开始的Java开发】2-10-2 Servlet入门:Servlet开发步骤、请求参数的发送与接收、Get和Post、注解
    Redis系列:Geo 类型赋能亿级地图位置计算
    vscode的 c++ 环境搭建
    kafka 文件存储 消息同步机制
    mongodb 数据分析
    [附源码]java毕业设计 停车场管理系统
    Discuz3.X各广告位的具体位置和效果探究
  • 原文地址:https://blog.csdn.net/m0_73841621/article/details/136690480