日期问题
小明正在整理一批历史文献。这些历史文献中出现了很多日期。
小明知道这些日期都在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
题目不难,容易实现。拿到题目就直接写了,写到中途才意识到不要写的这么杂,心痛,懒得改了就TAT
不过有几个需要注意的地方:- 日期的判断,日期要根据年和月来判断该日期是否符合要求(比如如果月份为2,要判断该年是不是闰年,得该月最多有多少天,输入的日期是否超过该月的天数)
- 输入样例为01/01/01时,结果输出只有一种情况而不是三种
代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include<vector>
#include<string>
using namespace std;
int D[] = { 0,31,0,31,30,31,30,31,31,30,31,30,31 };
bool isY(int year) {
if (year % 4 == 0 && year % 100 != 0) {
return true;
}
return false;
}
int getDays(int year, int month) {
if (month != 2) {
return D[month];
}
if (isY(year))return 29;
return 28;
}
string getY(int num) {
string str=to_string(num);
if (num < 10)str.insert(0, "0");
if (num >= 0 && num <= 59) {
str.insert(0, "20");
return str;
}
str.insert(0, "19");
return str;
}
int main() {
vector<string> v;
vector<string>::iterator it=v.begin();
string str, str1, str2, str3;
cin >> str;
str1 = str.substr(0, 2);
str2 = str.substr(3, 2);
str3 = str.substr(6, 2);
int num1 = atoi(str1.c_str());
int num2 = atoi(str2.c_str());
int num3 = atoi(str3.c_str());
//年在前面
if (num2 <= 12 && num2 >= 1) {
string year = getY(num1);
int days = getDays(atoi(year.c_str()), num2);
if (num3 >= 1 && num3 <= days)
{
string n = year + "/" + str2 + "/" + str3;
it = find(v.begin(), v.end(), n);
if(it==v.end())
v.push_back(n);
}
}
//月在前面
if (num1 >= 1 && num1 <= 12) {
string year = getY(num3);
int days = getDays(atoi(year.c_str()), num1);
if (num2 >= 1 && num2 <= days) {
string n = year + "/" + str1 + "/" + str2;
it = find(v.begin(), v.end(), n);
if (it == v.end())
v.push_back(n);
}
}
//日在前面,日月年
if (num2 >= 1 && num2 <= 12)
{
string year = getY(num3);
int days = getDays(atoi(year.c_str()), num2);
if (num1 >= 1 && num1 <= days) {
string n = year + "/" + str2 + "/" + str1;
it = find(v.begin(), v.end(), n);
if (it == v.end())
v.push_back(n);
}
}
for (it = v.begin(); it != v.end(); it++) {
cout << *it << endl;
}
return 0;
}
其实可以把这种判断写成函数,然后让输入的字符串的年月日放在不同的位置传值进去判断情况是否成立。。代码就少很多。