第八届蓝桥杯个人赛省赛(软件类)C++B组试题第七题

一【题目描述】


标题:日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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 <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

二【解题思路】

     这个是一道编程题,编程题的话还是要认真的看看题目的。它是想要我们对日期进行输出,好的,这种题目当然例子是很重要的,所以我们来看它举的例子,输入1/2/3,那么它给出的变化就只有1/2/3,3/1/2,3/2/1。所以我们需要做的工作就是处理输入,得到我们需要的这三个片段,当然我们可以利用"/"来处理得到它们,然后处理的时候,年份与题目给出的范围进行判断,并且有润年和平年,对2月的天数进行判断。最后处理输出即可。逻辑上是很简单的,但是就困难在处理输入输出上,这非常的繁琐,所以我们慢慢且细心的写代码吧。

三【解题步骤】

#include<iostream>
#include<string>//对输入的数字进行字符串处理
#include<set>//符合的我们添加进入set容器中,会自动排序且去重
#include<sstream>//我们利用字符串流处理字符串
using namespace std;
set<string>s;//set容器
bool is_Leap(int year)//进行润年的判断,大家都很熟悉了
{
	if(year%400==0||(year%4==0&&year%100!=0)) return true;
	else return false;
}
void i2s(int a,string &b)//将整数转化为字符串
{
	stringstream s;//创建一个C++串流的输入输出对象
	s<<a;//读入整数
	s>>b;//将整数转换为字符串
}
string f(int a,int b,int c)//函数处理
{
	if(a>=0&&a<=59) a = a+2000;//年份判断
	else if(a>=60&&a<=99) a = a+1900;
	if(b>12||b<1) return "";//边界值处理
	if(c<1||c>31) return "";
	switch(b)//这里进行月份的处理,细心一点就好了
	{
		case 2:
			if(is_Leap) {
				if(b>29) return "";
			}
			else if(!is_Leap)
			{
				if(b>28) return "";
			}
			break;
		case 4:
			if(b>30) return "";
				break;
		case 6:
			if(b>30) return "";
				break;
		case 9:
			if(b>30) return "";
				break;
		case 12:
			if(b>30) return "";
				break;
		default:
			break;
	}
	string _a,_b,_c;
	i2s(a,_a);//将数字转换为字符串
	i2s(b,_b);
	i2s(c,_c);
	if(_b.length()==1) _b="0"+_b;//如果是个位数,前面添0
	if(_c.length()==1) _c="0"+_c;
	return _a+"-"+_b+"-"+_c;//得到结果字符串
}
int main()
{
	int a,b,c;
	string in;
	cin>>in;	
	a=(in[0]-'0')*10+(in[1]-'0');//进行输入的处理,减去'0',然后进行数字的操作
	b=(in[3]-'0')*10+(in[4]-'0');
	c=(in[6]-'0')*10+(in[7]-'0');
	string s1,s2,s3;
	s1 = f(a,b,c);//三种变换
	s2 = f(c,b,a);
	s3 = f(c,a,b);
	if(s1!="")s.insert(s1);//如果符合,添加进容器
	if(s2!="")s.insert(s2);	
	if(s3!="")s.insert(s3);
	for(set<string>::iterator iter = s.begin();iter!=s.end();iter++)//输出	
	{
		cout<<*iter<<endl;
	}
	return 0;
}

 

四【总结】

     这里用到了C++中的字符串输入输出流来处理字符串,可以简单的了解一下stringstream,如果想深入了解,有很多很详细的讲解的哦。

如有误或者有更好的方法,可以讨论哦,谢谢。

发布了123 篇原创文章 · 获赞 234 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/105292407
今日推荐