日期问题(蓝桥杯)

文章目录

日期问题

题目描述

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

暴力枚举

cpp 复制代码
// 包含C++标准库,用于输入输出
#include<bits/stdc++.h>
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月份,因为它的天数与是否为闰年有关。

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

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

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

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

相关推荐
埃菲尔铁塔_CV算法几秒前
深度学习驱动下的目标检测技术:原理、算法与应用创新
深度学习·算法·目标检测
Dream it possible!14 分钟前
LeetCode 热题 100_寻找重复数(100_287_中等_C++)(技巧)(暴力解法;哈希集合;二分查找)
c++·leetcode·哈希算法
float_com29 分钟前
【背包dp-----分组背包】------(标准的分组背包【可以不装满的 最大价值】)
算法·动态规划
丶Darling.1 小时前
Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先
数据结构·c++·算法·二叉树
L_cl2 小时前
【Python 算法零基础 3.递推】
算法
醍醐三叶2 小时前
C++文件操作--2 二进制文件操作
开发语言·c++
int型码农2 小时前
数据结构第七章(四)-B树和B+树
数据结构·b树·算法·b+树
li星野2 小时前
C++:C++内存管理
开发语言·c++
溟洵2 小时前
【C++ Qt】布局管理器
开发语言·c++·qt
我家大宝最可爱3 小时前
c++动态链接库
开发语言·c++