蓝桥杯 历届试题 回文日期 C

问题描述
2020年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。
因为如果将这个日期按 yyyymmdd 的格式写成一个8位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是“千年一遇”的特殊日子。
对此小明很不认同,因为不到2年之后就是下一个回文日期:20211202即2021年12月2日。
也有人表示20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。
对此小明也不认同,
因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即2121年12月12日。算不上“千年一遇”,顶多算“千年两遇”。
给定一个8位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入格式
输入包含一个八位整数 N,表示日期。
输出格式
输出两行,每行1个八位数。
第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
ABABBABA

ABABBABA
样例输入
20200202
样例输出
20211202
21211212
评测用例规模与约定
对于所有评测用例,10000101 \le N \le 89991231, 保证 N 是一个合法日期的 8 位数表示。

#include <stdio.h>
#include <stdlib.h>

void shuchu(char []);
void outrq(int );
int shiABAB(int );
int hefa(int ,int ,int );

int main(void)
{
	char str[9] ;
	gets(str);
	shuchu(str);
	return 0;
}


void outrq(int s)
{
	printf("%d",s);
	while ( s > 0 )
	{
		printf("%d",s%10);
		s /= 10 ;
	}
	putchar('\n');
}

int shiABAB(int s)
{
	if ( s / 100 == ( s % 100 ) && ( s / 1000 != (s / 100) % 10 ))
	{
		return 1 ;
	}
	return 0 ;
}

int hefa(int s,int a,int b)
{
	int t = s , w = 0 ;
	while ( t > 0 )
	{
		w *= 10 ;
		w += t % 10 ;
		t /= 10 ;
	}
	if ( s == a && w <= b )
	{
		return 0 ;
	}
	int yue = 0  , ri = 0 ;
	yue += ( s %  10) * 10 + ( (s / 10) % 10 ) ;
	ri += ( (s / 100) % 10 ) * 10 + ( s / 1000) ;
	if ( yue > 12 || yue == 0 )
	{
		return 0 ;
	}
	if ( ri > 31 || ri == 0 )
	{
		return 0 ;
	}
	if ( yue == 1 && ri <= 31 )
	{
		return 1 ;
	}
	if ( (s % 4 == 0 && s % 100 != 0 )|| s % 400 == 0 )
	{
		if ( yue == 2 && ri <= 29 )
		{
			return 1 ;
		}
	}
	else
	{
		if ( yue == 2 && ri <= 28 )
		{
			return 1 ;
		}
	}
	if ( yue == 3 && ri <= 31 )
	{
		return 1 ;
	}
	if ( yue == 4 && ri <= 30 )
	{
		return 1 ;
	}
	if ( yue == 5 && ri <= 31 )
	{
		return 1 ;
	}
	if ( yue == 6 && ri <= 30 )
	{
		return 1 ;
	}
	if ( yue == 7 && ri <= 31 )
	{
		return 1 ;
	}
	if ( yue == 8 && ri <= 31 )
	{
		return 1 ;
	}
	if ( yue == 9 && ri <= 30 )
	{
		return 1 ;
	}
	if ( yue == 10 && ri <= 31 )
	{
		return 1 ;
	}
	if ( yue == 11 && ri <= 30 )
	{
		return 1 ;
	}
	if ( yue == 12 && ri <= 31 )
	{
		return 1 ;
	}
	return 0 ;
}

void shuchu(char a[])
{
	int q = 0 , p = 0 ;
	int i ;
	for ( i = 0 ; i < 4 ; i ++ )
	{
		q *= 10 ;
		q += a[i] - '0' ;
	}
	for ( i = 4 ; i < 8 ; i ++ )
	{
		p *= 10 ;
		p += a[i] - '0' ;
	}
	int t = 1 , z = 1 ;
	for ( i = q ; i <= 9999 ; i ++ )
	{
		if ( t == 1 )
		{
			if ( hefa(i,q,p) )
			{
				outrq(i);
				t = 0 ;
			}
		}		
		if ( hefa(i,q,p) && shiABAB(i) &&z == 1 )
		{
			outrq(i);
			z = 0 ;
			break;
		}
	}
}
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值