C/C++蓝桥杯之日期问题

问题描述:小明正在整理一批文献,这些文献中出现了很多日期,小明知道这些日期都在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''多个日期按从早到晚的顺序排列。

分析:本题的思路很简单,将输入的三个数据分别进行年,月,日的合法判断,如果合法就输出,但是求解本题要注意以下两点。

(1)月份数据的表示

由于每月的天数没有规律性,所以最好的方法就是利用数组将每月的天数表示出来,如:

int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

这里还要注意闰年问题,如果是闰年,则二月的数据就会不同,可以采用另一个数组存储

如:int leapdays[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

(2)合法年/月/日的存储

对于一组数据可能会出现重复的合法年/月/日。例如:01/01/01,这三组合法数据都是2001/01/01,所以这要进行去重。

去重时,可以采用直接判断三组数据是否相等的方法,也可以利用C++ STL中的set容器进行自动去重。

用C语言: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//不是闰年的时候
int leapdays[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };//是闰年的时候
int data[4][4];//用来存放日期
int i;//用于数组的序号 
int leapyear(int year)//判断是否是闰年
{if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){return 1;}else{return 0;}
}
void check(int y, int m, int d)
{if (y >= 60)//年份的后两位大于60,说明应该是19年开头{y = 19 * 100 + y;}else//否则是20年开头{y = 20 * 100 + y;}if (m > 12)return;if(leapyear(y))//判断是否是闰年,采用对应的数组{if(leapdays[m]<d)return;}else{if(days[m]<d)return;}if (i > 0)//进行去重处理{for (int j = 0; j < i; j++){if (data[j][0] == y && data[j][1] == m && data[j][2] == d)//判断日期是不是合法 return;}}data[i][0] = y;data[i][1] = m;data[i][2] = d;i++;
}int main()
{int a, b, c, e, f, g;int d[3];i = 0;scanf("%d/%d/%d", &a, &b, &c);check(a, b, c);//分别互换日期查看是否成立check(c, a, b);check(c, b, a);for (int j = 0; j < i; j++){d[j] = data[j][0] * 10000 + data[j][1] * 100 + data[j][2];}for (int m = 0; m < i; m++)//按从早到晚的顺序排列{for (int n=0; n < i - 1 - m; n++){if (d[n] > d[n + 1]){int tmp = d[n];d[n] = d[n + 1];d[n + 1] = tmp;}}}for (int j = 0; j < i; j++)//打印{e = d[j] / 10000;f = (d[j] / 100) % 100;g = d[j] % 100;printf("%d-%02d-%02d\n", e, f, g);}return 0;
}

用C++:

#include<bits/stdc++.h>
using namespace std;
struct date  //定义一个结构体存放日期
{ int year;int month;int day;
}que[4];
int s=0; //用于结构体的序号 
int cmp(date x,date y);//比较函数sort的参数,定义了怎样排序 
int leapyear(int year);//用于判断是不是闰年 
int judge_date(int year,int month,int day);//判断日期是不是合法 
void judge(int year,int month,int day);//主要调用上面函数,把日期存进数组 void judge(int year,int month,int day)
{int flag=1; //标记日期是否重复 if(year>=60)//年份的后两位大于60,说明应该是19年开头year = 19* 100 + year;else year = 20* 100 + year;if(judge_date(year,month,day)){   //如果日期合法 for(int i=0;i<s;i++){    //判断结构体中是否已经存在相同的日期 if(que[i].day==day&&que[i].month==month&&que[i].year==year){   flag=0;break;}}if(flag){   //如果没有相同的日期就存进结构体中 que[s].year=year;que[s].month=month;que[s].day=day;s++;}}	
}int judge_date(int year,int month,int day) //判断日期是否合法 
{  int sum;switch(month) //判断输入的月份一共有多少天,和输入的天数比较 {  case 1: case 3: case 5: case 7: case 8: case 10: case 12:sum=31;break;case 4:case 6: case 9: case 11:sum=30;break;case 2:sum=28;break;}if(month==2&&leapyear(year))sum=29;if(sum>=day&&day>0&&month>=1&&month<=12) //如果天数小于该月总天数,且大于0,月份也在1~12,则合法 return 1; elsereturn 0;
}int leapyear(int year)
{   //判断是否闰年 if(year%4==0 && year%100!=0 || year%400==0)return 1;elsereturn 0;
}int cmp(date x,date y)
{   //比较函数 if(x.year<y.year) //年份按递增排序 return 1;else if(x.year==y.year) {   //如年份相同,比较月份 if(x.month<y.month)return 1;else if(x.month==y.month) //如月份相同,比较天数 {  if(x.day<y.day)return 1;}}return 0;
} 
int main()
{int a,b,c;scanf("%d/%d/%d",&a,&b,&c);judge(a,b,c);//分别把日期换位置,看是否合法judge(c,a,b);judge(c,b,a);sort(que,que+s,cmp);//按从早到晚的顺序排列 for(int i=0;i<s;i++)//输法日期 printf("%d-%02d-%02d\n",que[i].year,que[i].month,que[i].day);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯刷题--python-20-多路归并,贡献法

1262. 鱼塘钓鱼 - AcWing题库 nint(input()) a[0]list(map(int,input().split())) b[0]list(map(int,input().split())) l[0]list(map(int,input().split())) spend[0 for i in range(n1)] for i in range (1,n): l[i]l[i-1] tint(input()) def get(k): return max(0,a…

拿捏算法的复杂度

目录 前言 一&#xff1a;算法的时间复杂度 1.定义 2.简单的算法可以数循环的次数&#xff0c;其余需要经过计算得出表达式 3.记法&#xff1a;大O的渐近表示法 表示规则&#xff1a;对得出的时间复杂度的函数表达式&#xff0c;只关注最高阶&#xff0c;其余项和最高阶…

【音视频开发好书推荐2】《FFmpeg 音视频开发基础与实战》

1、多媒体处理开源库FFmpeg概述 享有盛名的音视频多媒体处理开源库FFmpeg&#xff0c;做过音视频编解码开发的同学基本都用过&#xff0c;即便没做过这方面开发&#xff0c;也会听说过这个开源库。 FFmpeg是目前最全面的开源音视频编解码库&#xff0c;包括常用的音视频编码协议…

JavaScript原型和原型链

JavaScript每个对象拥有一个原型对象 需要注意的是&#xff0c;只有函数对象才有 prototype 属性 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff…

C++指针(五)完结篇

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 前言 相关文章&#xff1a;C指针&#xff08;一&#xff09;、C指针&#xff08;二&#xff09;、C指针&#xff08;三&#xff09;、C指针&#xff08;四&#xff09;万字图文详解&#xff01; 本篇博客是介…

ai学习前瞻-python环境搭建

python环境搭建 Python环境搭建1. python的安装环境2. MiniConda安装3. pycharm安装4. Jupyter 工具安装5. conda搭建虚拟环境6. 安装python模块pip安装conda安装 7. 关联虚拟环境运行项目 Python环境搭建 1. python的安装环境 ​ python环境安装有4中方式。 从上图可以了解…

Vuforia Engine 支持的操作系统、工具和设备版本

支持的版本 Vuforia Engine 支持以下操作系统、工具和设备版本,以便使用 Vuforia Engine 平台开发应用程序。 移动设备

物联网电气融合实训室建设方案

1 教学实训总体设计 1.1 建设背景 &#xff08;一&#xff09;政策推动与战略部署 近年来&#xff0c;物联网技术在全球范围内得到了广泛的关注和应用。作为信息技术的重要组成部分&#xff0c;物联网在推动经济转型升级、提升社会管理水平、改善民生福祉等方面发挥着重要作…

python实现桶排序

排序算法&#xff1a; python实现基数排序 python实现归并排序 python实现交换排序 python实现选择排序 python实现插入排序 python实现桶排序 桶排序&#xff08;Bucket Sort&#xff09;是一种排序算法&#xff0c;它将待排序的元素分到有限数量的桶&#xff08;buckets&…

Ps:清理

清理 Purge命令位于“编辑”菜单下&#xff0c;它主要用于释放 Photoshop 使用的内存资源&#xff0c;有助于提高系统的性能。 通过使用“清理”命令&#xff0c;用户可以有效管理 Photoshop 的资源使用&#xff0c;特别是在处理大型文件或进行长时间编辑会话时。 定期清理可以…

Redis持久化的两种方式

什么是Redis持久化&#xff1f; 因为redis是内存里的数据库&#xff0c;将redis中的数据保存到硬盘里就是持久化。以便在重启机器、机器故障之后恢复数据。 Redis支持两种不同的持久化操作&#xff1a; 1. 快照&#xff08;snapshotting&#xff0c;RDB&#xff09; 2. 只追…

python 基础知识点(蓝桥杯python科目个人复习计划61)

今日复习内容&#xff1a;想到什么复习什么 因为比赛用到的编辑器是IDLE&#xff0c;所以从现在开始&#xff0c;我就不用pycharm了。 例题1&#xff1a; 从1到2020的所有数字中&#xff0c;有多少个2&#xff1f; 这个题是一个填空题&#xff0c;我用的方法是先在编辑器上…

Spring篇面试题 2024

目录 Java全技术栈面试题合集地址Spring篇1.什么是“依赖注入”和“控制反转”&#xff1f;2.构造器注入和 setter 依赖注入&#xff0c;那种方式更好&#xff1f;3.什么是 Spring Framework&#xff1f;4.Spring Framework 有哪些不同的功能&#xff1f;5.Spring Framework 中…

第14章 西瓜书——概率图模型

概率图模型 概率图模型&#xff08;Probabilistic Graphical Model&#xff09;是用图结构来表示多元随机变量之间条件依赖关系的模型。在图模型中&#xff0c;节点表示随机变量&#xff0c;边表示变量之间的依赖关系。概率图模型可以分为有向图模型&#xff08;如贝叶斯网络&a…

python 给出提示,等待用户输入

在Python中&#xff0c;你可以使用内置的input()函数来提示用户输入信息。下面是一个简单的例子&#xff1a; python # 提示用户输入姓名 name input("请输入您的姓名: ")# 提示用户输入年龄&#xff0c;并将其转换为整数&#xff08;如果可能&#xff09; try:age…

实现bert训练 人工智能模型

实现BERT的训练相对复杂&#xff0c;但以下是一个简单的示例代码&#xff0c;用于使用Hugging Face库中的transformers模块在PyTorch中训练BERT模型&#xff1a; import torch from torch.utils.data import DataLoader from transformers import BertTokenizer, BertForSeque…

Oracle VM VirtualBox安装Ubuntu桌面版

背景&#xff1a;学习Docker操作 虚拟机软件&#xff1a;Oracle VM VirtualBox 7.0 系统镜像&#xff1a;ubuntu-20.04.6-desktop-amd64.iso 在Oracle VM VirtualBox新建一个虚拟电脑 选择好安装的目录和选择系统环境镜像 设置好自定义的用户名、密码、主机名 选择一下运行内…

交易平台开发:构建安全/高效/用户友好的在线交易生态圈

在数字化浪潮的推动下&#xff0c;农产品现货大宗商品撮合交易平台已成为连接全球买家与卖家的核心枢纽。随着电子商务的飞速发展&#xff0c;一个安全、高效、用户友好的交易平台对于促进交易、提升用户体验和增加用户黏性至关重要。本文将深入探讨交易平台开发的关键要素&…

Mac使用自动操作(Automator)发送文件到Android设备

需求场景 在Android开发调试的过程中&#xff0c;当需要把电脑上的文件传输到连接的Android设备时&#xff0c;通常的做法是通过adb push命令。那既然是通过命令操作&#xff0c;是否可以通过可视化的工具来操作呢&#xff1f;例如在Finder中&#xff0c;右击某一个文件或者目…

软件测试相关内容第三弹--软件测试基础

写在前&#xff1a;在前篇的两篇博客介绍中我们主要学习软件测试的相关概念&#xff0c;对软件测试进行了初步的了解&#xff0c;本篇博客将进一步进行学习。重点内容包括&#xff1a;软件测试的生命周期、如何描述一个bug、如何定义bug的级别、bug的生命周期以及在实际工作中如…