蓝桥杯:日期问题

日期问题【枚举】

题目描述

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 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)。

输出描述

输出若干个不相同的日期,每个日期一行,格式是 “yyMMdd”。多个日期按从早到晚排列。

输入输出样例

示例

输入

02/03/04

输出

2002-03-04
2004-02-03
2004-03-02

思路:

这道提的思路并不难,题目上说年月日的日期顺序可能不对,日期从小到大输出存在的可能,题目上说有采用年/月/日的,
有采用月/日/年的,还有采用日/月/年的,但答案却不是按这样说的。应该是有的采用年/月/日、采用日/年/月、采用日/月/年
我定义一个函数,把这三种顺序分别带进函数,判断是不是合法的日期,如果是存进结构体数组,用结构体数组方便日期排序和
判断日期是不是重复。
日期合法应该是满足以下条件:

  • 年:按题意,后两位大于等于60属于20世纪,否则属于21世纪
  • 月:在1月到12月之间
  • 日:先判断是不是闰年,接着判断该月份有多少天,最后把该月份最大天数与输入的月份比较,输入的月份要小于最大天数
    且日必须大于0

满足以上条件为合法日期,存进结构体数组,但要判断结构体数组是否存在相同日期,如果没有则存进。
存进数组后对数组进行排序,最后输出日期

代码:

#include<bits/stdc++.h>
using namespace std;
struct date
{   //定义一个结构体,存放合法日期,方便排序 
	int year;
	int month;
	int day;
}que[4];
int s=0;  //用于结构体的序号 

int cmp(date x,date y);  //比较函数sort的参数,定义了怎样排序 
int judge_year(int year);  //用于判断是不是闰年 
int judge_date(int year,int month,int day);  //判断日期是不是合法 
void judge(int year,int month,int day);  //主要调用上面函数,把合法日期存进数组 

int main()
{
	int a,b,c;
	scanf("%d/%d/%d",&a,&b,&c); 
	judge(a,b,c);  //分别把日期换位置,看是否合法 
	judge(c,a,b);
	judge(c,b,a);
	sort(que,que+s,cmp);  //把合法日期进行排序 
	for(int i=0;i<s;i++)   //输出合法日期 
		printf("%d-%02d-%02d\n",que[i].year,que[i].month,que[i].day);
	return 0;
}

void judge(int year,int month,int day)
{   //判断函数 
	int flag=1; //标记日期是否重复 
	if(year<60)  //如果小于60,由题意知为20世纪 
		year=year+2000;
	else year=year+1900;  //否则为21世纪 
	if(judge_date(year,month,day))
	{   //如果日期合法 
		for(int i=0;i<s;i++)
		{    //判断结构体中是否已经存在相同的日期 
			if(que[i].day==day&&que[i].month==month&&que[i].year==year)
			{   
				flag=0;
				break;
			}
		}
		if(flag)
		{   //如果没有相同的日期就存进结构体中 
			que[s].year=year;
			que[s].month=month;
			que[s].day=day;
			s++;
		}
	}	
}

int judge_date(int year,int month,int day)
{   //判断日期是否合法 
	int sum;
	switch(month)
	{   //判断输入的月份一共有多少天,和输入的天数比较 
		case 1: case 3: case 5: case 7: case 8: case 10: case 12:
			sum=31;
			break;
		case 4:case 6: case 9: case 11:
			sum=30;
			break;
		case 2:
			sum=28;
			break;
	}
	if(month==2&&judge_year(year))
		sum=29;
	if(sum>=day&&day>0&&month>=1&&month<=12)
		return 1;  //如果天数小于该月总天数,且大于0,月份也在1~12,则合法 
	return 0;
}

int judge_year(int year)
{   //判断是否闰年 
	if(year%4==0&&year%100!=0||year%400==0)
		return 1;
	return 0;
}

int cmp(date x,date y)
{   //比较函数 
	if(x.year<y.year) //年份按递增排序 
		return 1;
	else if(x.year==y.year) 
	{   //如年份相同,比较月份 
		if(x.month<y.month)
			return 1;
		else if(x.month==y.month)
		{   //如月份相同,比较天数 
			if(x.day<y.day)
				return 1;
		}
	}
	return 0;
} 
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值