蓝桥杯学习记录||1229. 日期问题

该博客主要介绍了AcWing平台上的1229号编程题目,该题涉及到日期的解析与转换。题目要求从不同格式的日期字符串中找出可能的日期,并按顺序输出。博主给出了代码实现,通过将输入的日期分为年、月、日三种组合方式,检查每种组合的合法性并进行排序,避免重复输出。代码使用C++编写,利用日期合法性校验函数确保输出的日期在1960年至2059年间。
摘要由CSDN通过智能技术生成

AcWing||1229. 日期问题

活动地址:https://www.acwing.com/activity/content/19/

考察要点:

题目要求

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

小明知道这些日期都在1960年1月1日至2059年12月31日。

令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入格式
一个日期,格式是”AA/BB/CC”。

即每个’/’隔开的部分由两个 0-9 之间的数字(不一定相同)组成。

输出格式
输出若干个不相同的日期,每个日期一行,格式是”yyyy-MM-dd”。

多个日期按从早到晚排列。

数据范围

0≤A,B,C≤9

输入样例:

02/03/04

输出样例:

2002-03-04
2004-02-03
2004-03-02

题目地址:https://www.acwing.com/problem/content/1231/

解析:将输入的数据,转化为可能的日期,按年月日从早到晚输出。

代码思路 :将输入的数据分为a,b,c 三部分。题目给出可能为

  1. 年/月/日
  2. 月/日/年
  3. 日/月/年

按照这三种情况生成日期,如果生成的日期不合法就返回0,合法则返回日期,都存在date的数组中,进行排序,然后输出。
就会发现如果abc相同那么同样的日期会输出三次,date数组已经排序过,所以只有判断与前一个数据不相同才进行输出

在这里插入图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
 using namespace std;
 
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int getDate(int y, int m, int d)
{
    if(y >= 60) y += 1900;
    else y += 2000;
    
    if(m == 0 && m > 12) return 0;
    if(d == 0) return 0;
    
    if(m!= 2)
    {
       if(days[m] < d) return 0;
    }
    else
    {
       int leap = y % 100 && y % 4 == 0 || y % 400 == 0;
       if(d > 28 +leap) return 0;
    }
    return y * 10000 + m * 100 + d;
}
int main()
{
    int a, b, c;
    scanf("%d/%d/%d", &a, &b, &c);//年/月/日的,有采用月/日/年的,还有采用日/月/年
    int date[4];
    date[0] = 0;                //避免后面去重判断越界
    date[1] = getDate(a, b ,c); //年/月/日
    date[2] = getDate(c, a, b); //月/日/年
    date[3] = getDate(c, b, a); //月/日/年
    
    sort(date, date + 4);
    for (int i = 0; i < 4; i ++ )
    {
        if(date[i] && date[i] != date[i-1])
        {
            printf("%d-%02d-%02d\n",date[i] / 10000,date[i] % 10000 / 100, date[i] % 100);
        }
    }
    return 0;
}

注:

printf("%02d",date[i] % 100); 
//%02d 的意思是输出两位数据,不足用0补齐
scanf("%d/%d/%d", &a, &b, &c); 
// %d/%d中间有 / 那么输入数据是也需要有 / 这样就只会记录到数据,跳过 / 

本题:1229. 日期问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
《智能门锁》是蓝桥杯模拟试题中的一个压缩文件,后缀为.rar,这是一种常见的压缩格式。该压缩文件中可能包含与智能门锁相关的一些资料、文档、程序代码等内容。 智能门锁是一种结合了现代科技和安全需求的产品,通过使用该门锁,可以提高家居安全性和便利性。智能门锁通常采用电子技术与机械结合的方式,通过密码、指纹、人脸识别等方式对门进行解锁,具有高度的安全性和智能化。 通过解压《智能门锁》.rar文件,我们可以获取其中的内容,可能包括以下方面: 1. 产品介绍:介绍智能门锁的功能、特点和工作原理等,让用户了解该产品的基本信息。 2. 安装手册:提供智能门锁的安装教程,指导用户如何安装和调试智能门锁的硬件设备。 3. 用户指南:为用户提供使用智能门锁的详细说明,包括设置开锁密码、添加指纹或人脸识别等操作步骤。 4. 技术文档:包含智能门锁的技术规格、接口说明、电路图等详细信息,适合开发人员进行相关应用开发。 5. 示例代码:可能会提供一些示例代码,供开发人员参考和学习,帮助他们实现自己的智能门锁应用。 总的来说,《智能门锁》.rar文件可能会包含智能门锁的各个方面的资料和文档,帮助用户了解和使用智能门锁,以及开发人员进行智能门锁相关应用的开发。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值