[每天例题]蓝桥杯 C语言 日期问题

发布时间 2023-04-26 20:03:38作者: 山远尽成云

日期问题

题目

https://www.lanqiao.cn/problems/103/learning/?page=3&first_category_id=1&sort=students_count&difficulty=30

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入描述

一个日期,格式是 "AA/BB/CCAA/BB/CC" (0 \leq A, B, C \leq 90A,B,C9)。

输出描述

输出若干个不相同的日期,每个日期一行,格式是 "yyyy-MM-ddyyyyMMdd"。多个日期按从早到晚排列。

题目要求

1.这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日

2.这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

3.使得文献上的一个日期,存在很多可能的日期与其对应。

4.多个日期按从早到晚排列

思路分析

1.由于多个日期则需要按照从早到晚排序,所以当我们使用for循环将日期逐渐增大即可解决该问题。

2.在遍历日期时,我们需要进行日期判定,将不符合日期的数筛选出去。

3.对年份取后两位数,将年月日与文献的年月日一一对照,符合要求则输出。

代码

 

#include<stdio.h>
#include<stdlib.h>
int a,b,c;
int riqi(int i,int j,int k)
{
	i=i%100;//将年份取后两位数,符合文献记录格式 
	if(a==i&&b==j&&c==k)//年月日
	{
		return 1;
	}
	if(a==j&&b==k&&c==i)//月日年
	{
		return 1;
	}
	if(a==k&&b==j&&c==i)//日月年
	{
		return 1;
	}
	return 0;//不符合文献记载的日期 
}
int main()
{
	int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int i,j,k;
	scanf("%d/%d/%d",&a,&b,&c);
	for(i=1960;i<=2059;i++)
	{
		if((i%4==0&&i%100!=0)||(i%400==0))//判断是否为闰年 
		{
			days[2]=29;
		}
		else
		{
			days[2]=28;
		}
		for(j=1;j<=12;j++)//月份 
		{
			for(k=1;k<=days[j];k++)//日期 
			{
				if(riqi(i,j,k))
				{
					printf("%d-%02d-%02d\n",i,j,k);
				}
			}
		}
	}
	return 0;
}