[蓝桥杯][2017年第八届真题]日期问题

题目:
题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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<bits/stdc++.h>
using namespace std;
char a[10];
int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
struct Date {int day,month,year;}date[3]; 
bool cmp(Date x,Date y)
{
	if(x.year != y.year) return x.year < y.year;
	else if(x.month != y.month) return x.month < y.month;
	else return x.day < y.day;
}
bool leap(int year)
{
	if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) return true;
	return false;
}
int main()
{
	int sum[3],sum2[3],sum3[3],k = 0;
	cin >> a;
	sum[0] = (a[0] - '0') * 10 + a[1] - '0';
	sum[1] = (a[3] - '0') * 10 + a[4] - '0';
	sum[2] = (a[6] - '0') * 10 + a[7] - '0';
	if(sum[0] >= 60){
		if(leap(1900 + sum[0])) month[1] = 29;
		else month[1] = 28;
		if(sum[1] > 0 && sum[1] < 13){
			if(sum[2] > 0 && sum[2] <= month[sum[1] - 1]){
				date[k].day = sum[2];
				date[k].month = sum[1];
				date[k++].year = sum[0] + 1900;
			}
		}
	}
	else{
		if(leap(2000 + sum[0])) month[1] = 29;
		else month[1] = 28;
		if(sum[1] > 0 && sum[1] < 13){
			if(sum[2] > 0 && sum[2] <= month[sum[1] - 1]){
				date[k].day = sum[2];
				date[k].month = sum[1];
				date[k++].year = sum[0] + 2000;
			}
		}
	}
	if(sum[2] >= 60){
		if(leap(1900 + sum[2])) month[1] = 29;
		else month[1] = 28;
		if(sum[0] > 0 && sum[0] < 13){
			if(sum[1] > 0 && sum[1] <= month[sum[0] - 1]){
				date[k].day = sum[1];
				date[k].month = sum[0];
				date[k++].year = sum[2] + 1900;
			}
		}
	}
	else{
		if(leap(2000 + sum[2])) month[1] = 29;
		else month[1] = 28;
		if(sum[0] > 0 && sum[0] < 13){
			if(sum[1] > 0 && sum[1] <= month[sum[0] - 1]){
				date[k].day = sum[1];
				date[k].month = sum[0];
				date[k++].year = sum[2] + 2000;
			}
		}
	}
	if(sum[2] >= 60){
		if(leap(1900 + sum[2])) month[1] = 29;
		else month[1] = 28;
		if(sum[1] > 0 && sum[1] < 13){
			if(sum[0] > 0 && sum[0] <= month[sum[1] - 1]){
				date[k].day = sum[0];
				date[k].month = sum[1];
				date[k++].year = sum[2] + 1900;
			}
		}
	}
	else{
		if(leap(2000 + sum[2])) month[1] = 29;
		else month[1] = 28;
		if(sum[1] > 0 && sum[1] < 13){
			if(sum[0] > 0 && sum[0] <= month[sum[1] - 1]){
				date[k].day = sum[0];
				date[k].month = sum[1];
				date[k++].year = sum[2] + 2000;
			}
		}
	}
	sort(date,date + k,cmp);
	for(int i = 0;i < k;i++){
		if(i > 0 && date[i].year == date[i - 1].year && date[i].month == date[i - 1].month && date[i].day == date[i - 1].day) continue; 
		cout << date[i].year << "-";
		if(date[i].month < 10) cout << "0";
		cout << date[i].month << "-";
		if(date[i].day < 10) cout << "0";
		cout << date[i].day << endl;
	}
	return 0;	
}

这道题还是有点烦的,首先要判断3种可能的日期是否合法,合法的保存在数组中,然后根据日期从小到大进行排序,(注意题目要求从早到晚排列,我就漏看了这句话导致一直错),最后还要考虑去重,重复的日期只要输出一次。这道题考查的是仔细,仔细读题很重要!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值