我们处理一件事情,遇到困难,当怀疑自己的时候,请试试想想自己曾经做这件事的初衷。。。
题目
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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
资源约定
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
注意
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
分析
这题看着简单,但做起来就是一点思路也没有。。。原来是题目没看透,这只是第一道大题,我好颓废。。。
我想了好多天都没有思路,就是做不出来,看了别人的答案,也有好几个版本,但就是难下手,也不想下手,顺便找了一个人的代码,先贴上去再说,我被这题弄的好烦,我累了。。。
//#include<bits/stdc++.h>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
//日期打表
int monthNum[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
bool isLeap(int y){//判断是否是闰年
return y % 400 == 0 || (y % 4 == 0 && y % 100 == 0);
}
bool isYear(int x){//判断是2000前,还是20年后
if(x >= 60) return true;//如果是1960~1999之间
else return false;//如果是2000~2059年之间
}
bool isMonth(int x){//判断月份是否在1~12之间
if(x > 0 && x< 13) return true;
else return false;
}
bool isDay(int year, int month, int day){//判断日期是否正确
if(day <= monthNum[month][isLeap(year)] && day > 0)//判断日期是否是闰年,且对应月份的天数在1~合理的上限制
return true;
else
return false;
}
struct Date{//存贮日期
int y;
int m;
int d;
Date(int _y, int _m, int _d): y(_y), m(_m), d(_d){}
};
vector<Date> v;
void judge(int x, int y , int z){
int year = 0;
if(isMonth(y)){//年、月、日判断
if(isYear(x)){
year = 1900 + x;
if(isDay(year, y,z)){
// date[k].y = year;
// date[k].m = y;
// date[k].d = z;
v.push_back(Date(year, y, z));//动态数组存储日期
}
}else{
year = 2000 + x;
if(isDay(year, y,z)){
// date[k].y = year;
// date[k].m = y;
// date[k].d = z;
v.push_back(Date(year, y, z));
}
}
}
}
bool cmp(const Date &a, const Date &b){
if(a.y != b.y){
if(a.y >= 60 && b.y >= 60){
return a.y < b.y;
}else{
if(a.y >= 60 && b.y < 60) return a.y > b.y;
else return a.y < b.y;
}
}else if(a.m != b.m){
return a.m < b.m;
}else{
return a.d < b.d;
}
}
int main(){
int AA,BB,CC;
scanf("%d/%d/%d", &AA, &BB, &CC);
judge(AA,BB,CC);
judge(CC,AA,BB);
judge(CC,BB,AA);
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < v.size(); ++i) {
if(!i){
printf("%d-%02d-%02d\n", v[i].y, v[i].m, v[i].d);
}else{//去重复
if((v[i].y == v[i -1].y && v[i].m == v[i - 1].m && v[i].d == v[i - 1].d)){
continue;
}else{
printf("%d-%02d-%02d\n", v[i].y, v[i].m, v[i].d);
}
}
}
return 0;
}