问题描述
小明在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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
代码
#include <stdio.h>
#include <string>
#include <set>
#include <iostream>
string to_string(int num)
{
char buf[10];
sprintf(buf, "02%d", num);
string res = (string)buf; //char转string可直接强制转换
return ans;
}
int getDayNum(int YY, int MM)//若求日是否符合要求,必先求出年份及月份以其作为参数
{
int m[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//月份数组
if((YY % 4 == 0 && YY % 100 != 0) || YY % 400 == 0)//判断瑞年的条件
m[1] = 29;
return m[MM-1];//返回天数
}
string ifOK(int year, int mouth, int data)
{
int y;
string ans;
//判断年份是否符合要求
if(year >= 60){
y =1900 + year;
/*在c++11后可直接使用string库中的to_string(int num)
将int转换为string*/
ans += "19" + to_string(year) + "-";
}
else{
y = 2000 + year;
ans += "20" + to_string(year) + "-";
}
//判断月份是否符合要求
if(mouth >= 1 && mouth <= 12)
ans += to_string(mouth) + "-";
else
return "";
//判断日是否符合要求
if(data >= 1 && data <= getDayNum(y, mouth))
ans += to_string(data);
else
return "";
return ans;
}
int main()
{
int AA, BB, CC;
scanf("%d\%d\%d", &AA, &BB, &CC);
set<string> s;
string str;
str = ifOK(AA, BB, CC);
if(str.length() > 0)
s.insert(str);
str = ifOK(BB, CC, AA);
if(str.length() > 0)
s.insert(str);
str = ifOK(CC, BB, AA);
if(str.length() > 0)
s.insert(str);
for(auto it = s.begin(); it != s.end(); it++)
cout << *it << endl;
}