蓝桥杯真题(纯C语言实现):小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。

题目描述

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

运行限制

最大运行时间:1s
最大运行内存: 256M

代码

#include<stdio.h>
typedef struct
{
	int year;
	int month;
	int day;
} Date;

int isLeap(int y)     //判断是否为闰年
{
	return (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0));
}

int judge(int year,int month,int day)   //判断输入的三个数是否是合法的年月日
{
	int leap=isLeap(year);
	if(month==2)
	{
		if(leap)   //闰年的2月天数条件
		{
			if(day<=29)
				return 1;
			else
				return 0;
		}
		else      //平年的2月天数条件
		{
			if(day<=28)
				return 1;
			else
				return 0;
		}
	}
	else      //非2月天数需要满足的条件30/31
	{
		if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)   //31天条件
		{
			if(day<=31)
				return 1;
			else
				return 0;
		}
		else if(month==4||month==6||month==9||month==11)      //30天条件
		{
			if(day<=30)
				return 1;
			else
				return 0;
		}
		else     //月份不满足条件
		{
			return 0;
		}
	}
}

void swap(Date *date1,Date *date2)
{
	Date tmp;
	tmp = *date1;
	*date1 = *date2;
	*date2 = tmp;
}

void date_sort(Date date[],int n)
{
	for(int i=0; i<=n; i++) //冒泡排序法排序日期
		for(int j=0; j<n-i; j++)
		{
			if(date[j].year>date[j+1].year)    //优先排序年份
			{
				swap(&date[j],&date[j+1]);
			}
			else if(date[j].year==date[j+1].year)
			{
				if(date[j].month>date[j+1].month)   //年份相同排序月份
				{
					swap(&date[j],&date[j+1]);
				}
				else if(date[j].month==date[j+1].month)
				{
					if(date[j].day>date[j+1].day)     //年份月份相同排序天数
					{
						swap(&date[j],&date[j+1]);
					}
				}
			}
		}
}

void print_date(Date date[],int n)
{
	for(int i=0; i<=n; i++)
	{
		printf("%d-",date[i].year);  //输出年份
		if(date[i].month<=9)
			printf("0%d-",date[i].month);  //输出月份
		else
			printf("%d-",date[i].month);
		if(date[i].day<=9)
			printf("0%d\n",date[i].day);  //输出天数
		else
			printf("%d\n",date[i].day);
	}
}

int main()
{
	Date date[3];
	int AA,BB,CC,year_real;
	int n=0;
	scanf("%d%d%d",&AA,&BB,&CC); //输入AA/BB/CC

	if(AA<60)     //判断年(AA)月(BB)日(CC)表示的合理性
		year_real=2000+AA;
	else
		year_real=1900+AA;
	if(judge(year_real,BB,CC))
	{
		date[n].year=year_real;
		date[n].month=BB;
		date[n].day=CC;
		n++;
	}

	if(CC<60)     //判断月(AA)日(BB)年(CC)表示的合理性
		year_real=2000+CC;
	else
		year_real=1900+CC;
	if(judge(year_real,AA,BB))
	{
		date[n].year=year_real;
		date[n].month=AA;
		date[n].day=BB;
		n++;
	}

	//判断日(AA)月(BB)年(CC)表示的合理性
	if(judge(year_real,BB,AA))
	{
		date[n].year=year_real;
		date[n].month=BB;
		date[n].day=AA;
		n++;    //符合条件都加一,减一后即为index
	}

	date_sort(date,n-1);  //排序日期
	print_date(date,n-1); //输出日期
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值