解题思路:

题比较简答,但比较复杂
注意事项:
1.是否为闰年

2.平月大月

3.对00年的特殊处理

4.相同时间的去除

5.排序
参考代码:

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <set>
using namespace std;
//首先判断是否闰年
set<string>s;
bool isrun(int n)
{
	if (n % 100 == 0)
	{
		if (n % 400 == 0)
			return true;
		return false;
	}
	else {
		if (n % 4 == 0 && n % 100 != 0)
			return true;
		return false;
	}
}
int string2int(string str)
{
	int n;
	stringstream ss;
	ss << str;
	ss >> n;
	return n;
}
string int2string(int n)
{
	string s;
	stringstream ss;
	ss << n;
	ss >> s;
	return s;
}
bool isProData(int mon, int day)
{
	if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon == 12)
	{
		if (day <= 31)
			return true;
		return false;
	}
	else {
		if (day <= 30)
			return true;
		return false;
	}
}
bool isdata(string year, string mon, string day)
{
	int yearInt = string2int(year);
	int monInt = string2int(mon);
	int dayInt = string2int(day);
	//先去除月份
	if (monInt > 12 || monInt <= 0)
		return false;
	if (dayInt <= 0 || dayInt >= 32)
		return false;
	if (yearInt >= 60)
		yearInt += 1900;
	else
		yearInt += 2000;
	if (isrun(yearInt))
	{
		if (monInt == 2)
		{
			if(dayInt > 0 && dayInt <= 29)
				return true;
			else {
				return false;
			}
		}
		else
		{
			return isProData(monInt, dayInt);
		}
	}
	//不是闰年
	else {
		if (monInt == 2)
		{
			if (dayInt > 0 && dayInt < 29)
				return true;
			else {
				return false;
			}
		}
		else
		{
			return isProData(monInt, dayInt);
		}
	}
}
void print(string a, string b, string c)
{
	int time1 = string2int(a);
	if (time1 >= 60)
		time1 += 1900;
	else
		time1 += 2000;
	a = int2string(time1);
	s.insert(a + "-" + b + "-" + c);
}
int main()
{
	string data;
	cin >> data;
	string t1, t2, t3;
	//取出三个时间
	t1 = data.substr(0, 2);
	t2 = data.substr(3, 2);
	t3 = data.substr(6);
	//年月日
	if (isdata(t1,t2,t3))
	{
		print(t1, t2, t3);
	}
	//月日年
	if (isdata(t3, t1, t2))
	{
		print(t3, t1, t2);
	}
	//日月年
	if (isdata(t3, t2, t1))
	{
		print(t3, t2, t1);
	}
	set<string>::iterator it = s.begin();
	for (it; it != s.end(); it++)
		cout << *it << endl;
	return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论