标题:日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在196011日至20591231日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年//日的,有采用月//年的,还有采用日//年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。 

 

比如02/03/04,可能是20020304日、20040203日或20040302日。 

 

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

 

输入

----

一个日期,格式是"AA/BB/CC" (0 <= A, B, C <=9) 

 

输入

----

输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。 

 

样例输入

----

02/03/04 

 

样例输出

----

2002-03-04 

2004-02-03 

2004-03-02

代码如下:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string a[3], B[3], C[3];
int A[3];
int R[12] = { 31,27,31,30,31,30,31,31,30,31,30,31 }; //月份表示
typedef struct node
{
	string str;
	int sum;
	int data;
	bool operator < (const node& x) const {         //重载比较,按sum值从小到大排列
		return sum < x.sum;
	}
}DATE[3];

void change(node t);                //按平年闰年修改
bool year(node t);                  //判断年份是平年闰年
bool month(node t);                 //判断月份是否符合
bool day(node t, node t1, node t2); //判断天数是否符合
void output(int a, string b, string c, int n);

int main()
{
	DATE q;
	string s;

	cin >> s;
	for (int i = 0; i < 3; i++)
	{
		q[i].str = a[i] = s.substr(i * 3, 2);     //节选年月日
		q[i].data = i;                            //位置标识符,用来去除不适合的位置
		q[i].sum = (s[i * 3] - '0') * 10 + (s[i * 3 + 1] - '0'); //字符数字化
	}
	sort(q, q + 3);       //重载后的排序
	int c, k = 0;
	for (int a = 0; a < 3; a++)
		for (int b = 0; b < 3; b++)
		{
			c = 3 - a - b;
			if (b != a && month(q[b]) && day(q[a], q[b], q[c]))    //遍历,去除不符合的情况
				output(q[a].sum, q[b].str, q[c].str, k++);        //排除重复的情况
		}

	return 0;
}
void change(node t)
{
	if (year(t))
		R[1] = 29;
	else
		R[1] = 28;
}
bool year(node t)
{
	int y;
	if (t.sum < 60)
		y = 2000 + t.sum;
	else
		y = 1900 + t.sum;
	return (y % 4 == 0 && y % 100 != 0 || y % 400 == 0);
}
bool month(node t)
{
	return(t.sum <= 12 && t.data != 2);
}
bool day(node t, node t1, node t2)
{
	change(t);
	return (t.data != 1 && t2.sum <= R[t1.sum - 1] && t2.sum > 0);
}
void output(int a, string b, string c, int n)
{
	A[n] = a; B[n] = b; C[n] = c;

	for (int i = 0; i < n; i++)
		if (a == A[i] && b == B[i] && c == C[i])          //去重
			return;

	if (a < 60) a = a + 2000;
	else a = a + 1900;
	cout << a << "-" << b << "-" << c << endl;
}


已通过编译器测试

猜你喜欢

转载自blog.csdn.net/tobealistenner/article/details/78806135