问题描述

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


励志用尽量少的代码做高效表达


心路历程

由于最近在备考蓝桥杯,上午集训队比赛,堪堪A掉了一道日期题,让我产生了训练这一专题的想法, 于是找到了这道题。

首先觉得思路不难但是复杂,考虑点如下:
1、要分三种情况输出
2、这三种情况中如果出现值相等的情况如何解决(如输入02/02/02)。
3、在不同年份和月份下天数的变化情况。

第一遍敲了大概一百行,提交。一个样例没过,

网搜后看到一位大神的代码,30多行就A掉了,于是学习,也做了一些改进。

对于考虑一:可以采用函数复用的方法,三合一,减少代码量。
对于考虑二:每次判定完将结果存储set容器中(有序且去重),最后直接输出容器值
对于考虑三:考虑用一个二维数组把月份和天数关联,这样就不需要进行复杂的判定。

还需要特别注意日期为负的情况,栽在这里没拿满分。

直接贴代码。


AC代码(改进前)

#include<sstream>
#include<iostream>
#include<cstdio>
#include<set>
#include<string>
using namespace std;
set<string>s;int m[2][13] = {0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31};bool leap(int y) {if((y%4==0 && y%100) || y%400==0) return true;return false;
}void check(int a, int b, int c) {char c1[15];if(a > 59 ) a+=1900;else a+= 2000;bool flag1 = false;if(b<=12 && b>=1) {if(b==1 || b==3 || b==5 || b==7 || b==8 || b==10 || b==12) {if(c<=31 && c>=1) flag1 = true;} else if(b==2) {       //二月 if(leap(a)) {if(c<=29 && c>=1) flag1 = true;   //闰年}    else {if(c<=28 && c>=1) flag1 = true; }} else if(b==4 || b==6 || b==9 || b==11) {  //30天的月份 if(c<=30 && c>=1) flag1 = true;}} if(flag1) {sprintf(c1,"%d-%02d-%02d",a,b,c);s.insert(c1);}
}
int main() {int a, b, c;scanf("%d/%d/%d", &a, &b, &c);check(a, b, c);check(c, a, b);check(c, b, a);for(set<string>::iterator it=s.begin(); it != s.end(); it++) cout << *it << endl;return 0;
}

可以看到,这段代码即使做了函数复用,采用了set容器存储,但没有把月份和天数关联在一个数组里,而是用if-else做多重判断,因此显著的增加了代码量。


AC代码(改进后)

#include<bits/stdc++.h>
using namespace std;
//当既需要判断月份又需要判断月份下的天数时,可以用数组关联。
int m[2][13] = {0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31};
set<string>e;bool leap(int y) {if((y%4==0 && y%100) || y%400==0) return true; //y%100简化  return false;
}void check(int a, int b, int c) {char c1[15];if(a>59) a+=1900;else a+=2000;int f = 0;                       if(leap(a)) f=1;  if(b>=1 && b<=12) if(c>=1 && c<=m[f][b]) {   sprintf(c1, "%d-%02d-%02d", a, b, c);    //打印 e.insert(c1);}
}int main() {int a, b, c;   scanf("%02d/%02d/%02d", &a, &b, &c);              check(a,b,c);  check(c,a,b);  check(c,b,a);for(set<string>::iterator it=e.begin(); it!=e.end(); it++) cout << *it << endl;
return 0;} 

如果这篇文章对你产生了帮助,就请给博主一个赞吧!大家的点赞是我创作的最大动力!

26行代码AC_试题 历届试题 日期问题 | 第八届蓝桥杯B组第七题相关推荐

  1. 27行代码AC_迷宫 2017年第八届蓝桥杯A组第一题(暴力、仿迷宫)

    题目描述 X星球的一处迷宫游乐场建在某个小山坡上. 它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母. 我们假设玩家是面朝上坡的方向站立,则: L表示走到左边的房间, R表示走 ...

  2. 2017届蓝桥杯java_2017第八届蓝桥杯JavaC组决赛(国赛)试题汇总及试题详解-Go语言中文社区...

    目录 题解待更新 第一题:数位和 题目描述 数学家高斯很小的时候就天分过人.一次老师指定的算数题目是:1+2+...+100. 高斯立即做出答案:5050! 这次你的任务是类似的.但并非是把一个个的数 ...

  3. 【蓝桥系列】——十三届蓝桥杯PythonB组第五题E题蜂巢(AC代码)

    大家好,我是普通小明,初入学习博客,一起加油! 首先,感谢 小蓝刷题 对我的鼓励,我也希望加入学习算法这个大家庭. 第一篇文章,有些不完美,还请多多指教. 目录 (好像我并不会用锚点T-T) 省赛心得 ...

  4. 试题 历届试题 包子凑数(dp)

    试题 历届试题 包子凑数 资源限制 时间限制:1.0s 内存限制:256.0MB 0x00 问题描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包 ...

  5. 试题 历届试题 翻硬币(贪心)

    试题 历届试题 翻硬币 资源限制 时间限制:1.0s 内存限制:256.0MB Work hard,Play harder. 问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排 ...

  6. java 试题 历届试题 单词分析 题解

    试题 历届试题 单词分析 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度 ...

  7. 试题 历届试题 幸运数(二分)

    试题 历届试题 幸运数 资源限制 时间限制:1.0s 内存限制:256.0MB 题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然 ...

  8. 试题 历届试题 买不到的数目(dp/数学)

    试题 历届试题 买不到的数目 资源限制 时间限制:1.0s 内存限制:256.0MB $Daily English 曾几何时,我流连梦境,心比天高,人生充满希望. I dreamed a dream ...

  9. 试题 历届试题 带分数(全排列)

    试题 历届试题 带分数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 ...

最新文章

  1. 业界 | 计算芯片革命来临?英伟达谷歌入局紧逼英特尔
  2. JavaWEB后端支付银联,支付宝,微信对接
  3. Angualr中通过原生js和ViewChild的方式获取dom
  4. 移动开发架构之MVVM模式
  5. 在JS中如何判断undefined和null
  6. javascript中本地储存、离线缓存、地理定位、网络状态
  7. 列表标签(HTML)
  8. open cv+C++错误总结(一)
  9. python做图书馆管理系统-为什么我学了一个月python基础了,还写不出简单图书馆系统?...
  10. ibm服务器安装2003系统,IBM X3650 M3服务器安装windows 2003的方法
  11. ORACLE GOLDENGATE: WHAT IS ADD TRANDATA REALLY DOING?
  12. 游戏音效的发展和制作游戏音效的意义
  13. 《大秦帝国》第四部,阵容太强大
  14. C/C++实现简单打飞机小游戏【初版】
  15. 【linux】软件管理
  16. 百万人同时在线直播的服务器,QQ游戏百万人同时在线的服务器架构实现
  17. 微商城分销系统软件首选—好分销微信三级分销系统源码定制
  18. 高校俱乐部发福利啦,晚了就没了,速度~
  19. Windows XP 安装 MTP 驱动
  20. 密码库LibTomCrypt学习记录——(1.4)分组密码算法——AES-NI指令与AES的速度

热门文章

  1. scrapy发送翻页请求
  2. python中的Xpath方法总结
  3. redis一主一从一哨兵,第一次主从切换成功,再次主从切换无法正常执行?
  4. 大厂「offer 收割机」修炼记
  5. DevOps,到底是开发还是运维?
  6. 曹大带我学 Go(1)——调度的本质
  7. C++中的多态(一)
  8. 体验共享——技术实现瓶颈与突破
  9. 三十年TCP与七年QUIC 谁才是未来?
  10. x265与SVT-HEVC现已合二为一