蓝桥杯2017第八届C语言B组省赛习题题解——习题G.日期问题

每日刷题(二十四)

蓝桥杯第八届C语言B组省赛习题

习题G:日期问题

在这里插入图片描述
在这里插入图片描述
这个题难度还是不大的,大家可能卡就在如何解析输入数据,这里我是将输入的数据输入一个数组,然后再将数组解剖成三块分给其他三个变量,这个题还考查了闰年以及月份所对应的天数的计算。
详细C代码如下

#include<stdio.h>

int leapyear(int year)
{
	if(year % 4 == 0 && year % 100 != 0)
		return 1;
	else if(year % 400 == 0)
		return 1;
	else
		return 0;
} 

int days(int month, int year)
{
	if(month == 2)
		if(leapyear(year))
			return 29;
		else
			return 28;
	else if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
		return 31;
	else
		return 30;
}

int main()
{
	char string[8];
	scanf("%s",string);
	int a, b, c;
	a = (string[0] - '0') * 10 + (string[1] - '0');
	b = (string[3] - '0') * 10 + (string[4] - '0');
	c = (string[6] - '0') * 10 + (string[7] - '0');
	//可能性一:年/月/日 
	if(a >= 60)			//先处理年 
		a += 1900;
	else
		a += 2000;
	if(b <= 12 && b >= 1)
		if(c <= days(b,a) && c >= 1)
		{
			printf("%d-%02d-%02d\n",a, b, c);
		}
	
	a = (string[0] - '0') * 10 + (string[1] - '0');
	b = (string[3] - '0') * 10 + (string[4] - '0');
	c = (string[6] - '0') * 10 + (string[7] - '0');
	//可能性二:月/日/年
	if(c >= 60)
		c += 1900;
	else
		c += 2000;
	if(a <= 12 && a >= 1) 
		if(b <= days(a,c) && b >= 1)
		{
			printf("%d-%02d-%02d\n",c, a, b);
		}
		
	a = (string[0] - '0') * 10 + (string[1] - '0');
	b = (string[3] - '0') * 10 + (string[4] - '0');
	c = (string[6] - '0') * 10 + (string[7] - '0');
	//可能性三:日/月/年 
	if(c >= 60)
		c += 1900;
	else
		c += 2000;
	if(b <= 12 && b >= 1)
		if(a <= days(b, c) && a >= 1)
			printf("%d-%02d-%02d\n",c, b, a);

	return 0;	 
} 

经过验证,没问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

很感谢评论区的友人指正,上面的代码不是很严谨,确实怪我没考虑到那么多方面,这里赔个不是,以下为2021-4-12-15:33修正的代码

为什么有问题呢,因为我上面的代码很可能会输出两三个一样的年份,当输入的都满足那三种情况时

C代码如下(全网最易懂且代码量最大的代码)

我知道也可以C++做,可以减少一些代码量,亦或是换种方法,但是我还是想把这种思路的做法画个句号

#include<stdio.h>

int leapyear(int year)
{
	if(year % 4 == 0 && year % 100 != 0)
		return 1;
	else if(year % 400 == 0)
		return 1;
	else
		return 0;
} 

int days(int month, int year)
{
	if(month == 2)
		if(leapyear(year))
			return 29;
		else
			return 28;
	else if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
		return 31;
	else
		return 30;
}

int main()
{
	char string[8];
	scanf("%s",string);
	int a, b, c;
	//flag为条件是否满足标志位 
	int flag[4] = {0};
	a = (string[0] - '0') * 10 + (string[1] - '0');
	b = (string[3] - '0') * 10 + (string[4] - '0');
	c = (string[6] - '0') * 10 + (string[7] - '0');
	int d, e, f;
	int g, h, i;
	//可能性一:年/月/日 
	if(a >= 60)			//先处理年 
		a += 1900;
	else
		a += 2000;
	if(b <= 12 && b >= 1)
		if(c <= days(b,a) && c >= 1)
		{
			flag[1] = 1;
		}
	
	d = (string[0] - '0') * 10 + (string[1] - '0');
	e = (string[3] - '0') * 10 + (string[4] - '0');
	f = (string[6] - '0') * 10 + (string[7] - '0');
	//可能性二:月/日/年
	if(f >= 60)
		f += 1900;
	else
		f += 2000;
	if(d <= 12 && d >= 1) 
		if(e <= days(d,f) && e >= 1)
		{
			flag[2] = 1;
		}
		
	g = (string[0] - '0') * 10 + (string[1] - '0');
	h = (string[3] - '0') * 10 + (string[4] - '0');
	i = (string[6] - '0') * 10 + (string[7] - '0');
	//可能性三:日/月/年 
	if(i >= 60)
		i += 1900;
	else
		i += 2000;
	if(h <= 12 && h >= 1)
		if(g <= days(h, i) && g >= 1)
			flag[3] = 1;
			
	int sort[4][4];
	sort[1][1] = a;
	sort[1][2] = b;
	sort[1][3] = c;
	
	sort[2][1] = f;
	sort[2][2] = d;
	sort[2][3] = e;
	
	sort[3][1] = i;
	sort[3][2] = h;
	sort[3][3] = g;
	
	int v1 = sort[1][1] * 10000 + sort[1][2] * 100 + sort[1][3];
	int v2 = sort[2][1] * 10000 + sort[2][2] * 100 + sort[2][3];
	int v3 = sort[3][1] * 10000 + sort[3][2] * 100 + sort[3][3];
	
	if(v1 == v2 && v1 == v3)
	{
		flag[2] = 0;
		flag[3] = 0;
	}
	else if(v1 == v2)
	{
		flag[1] = 0;
	}
	else if(v1 == v3)
	{
		flag[1] = 0;
	}
	else if(v2 == v3) 
	{
		flag[2] = 0;
	}
	
	int wan = 0;
	int digit[4] = {0};
	
	int neww[4];
	int chance;
	int cnt = 0;
	int cnn = 1;
	for(chance = 1; chance <= 3; chance++)
	{
		if(flag[chance])
		{
			neww[cnn++] = sort[chance][1] * 10000 + sort[chance][2] * 100 + sort[chance][3];
			cnt++;
		}
	}
	if(cnt == 0)
	{
		return 0;
	}
	else if(cnt == 1)
	{
		printf("%d-%02d-%02d\n",neww[cnn - 1] / 10000, neww[cnn - 1] % 10000 / 100, neww[cnn - 1] % 100);
	}
	else if(cnt == 2)
	{
		if(neww[1] > neww[2])
		{
			int temp = neww[1];
			neww[1] = neww[2];
			neww[2] = temp;
		}
		printf("%d-%02d-%02d\n",neww[1] / 10000, neww[1] % 10000 / 100, neww[1] % 100);
		printf("%d-%02d-%02d\n",neww[2] / 10000, neww[2] % 10000 / 100, neww[2] % 100);
	}
	else if(cnt == 3)
	{
		if(neww[1] > neww[2])
		{
			int temp = neww[1];
			neww[1] = neww[2];
			neww[2] = temp;
		}
		if(neww[1] > neww[3])
		{
			int temp = neww[1];
			neww[1] = neww[3];
			neww[3] = temp;
		}
		if(neww[2] > neww[3])
		{
			int temp = neww[2];
			neww[2] = neww[3];
			neww[3] = temp;
		}
		printf("%d-%02d-%02d\n",neww[1] / 10000, neww[1] % 10000 / 100, neww[1] % 100);
		printf("%d-%02d-%02d\n",neww[2] / 10000, neww[2] % 10000 / 100, neww[2] % 100);
		printf("%d-%02d-%02d\n",neww[3] / 10000, neww[3] % 10000 / 100, neww[3] % 100);
	}
	return 0;	 
} 

如果想看是否超出资源约定,可以试着加入以下元素
#include <time.h> 头文件
double start,finish; 变量
程序运行时间,在程序开始处用start=(double) clock(); 获得开始时间
在程序结束处用finish=(double)clock(); 获得结束时间
然后输出时间差 毫秒 数:
printf("%.4f ms",finish-start);
要查看内存使用情况可以在任务管理器中查看
我这个代码都是在资源约定以内的

这道题目的讲解到这里就算完成了,如果有什么其他的看法建议都可以在评论区进行交流讨论。如果喜欢我的文章,请记得三连哦,点赞关注转发,感谢您的支持,下期更精彩!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值