第十一届蓝桥杯比赛 B组 回文日期

试题G 回文日期

资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

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 型的回文日期。

样例输入

20200202

样例输出

20211202
21211212

评测用例规模与约定

对于所有评测用例,10000101<= N<= 89991231, 保证 N 是一个合法日期的 8 位数表示。

主要思想

  1. 要判断找到的数据是否符合日期规范,其中包括年份,月份和日,另外年份是要大于0,月份大于0小于12,而天数则要根据年和月来确定这一年的这一月的天数,并进行判断;
  2. 要判断日期是否满足回文条件,这里本人的思想就是将数据的每一位找出来逆序和原数据进行比较 ,若相等则是回文;
  3. 要判断是否符合ABABBABA,这个就比较简单了,得到前面和后面各四位,两两进行比较,AB和AB比较,BA和BA比较。若比较都相等则符合条件,输出。

下面是本人写的代码,大家可以参考下:

#include <iostream>
using namespace std;

const int month[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},//定义了二维数组,平年2月28天,闰年2月29天
				{0,31,29,31,30,31,30,31,31,30,31,30,31}};

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

// 判断是否为日期
bool isDate(int s)
{
	int y, m, d;
	bool flag = false;
	y = s / 10000;   // 得到年份 
	m = (s/100) % 100; // 得到月份 
	d = s % 100;  // 得到日 
	if (y > 0 && m > 0 && m <= 12)
	{
		if (d <= month[isLeapYear(y)][m]) // 判断日期是否正确 
		{
			flag = true; 
		}	
	}	
	return flag;
} 


// 判断回文
bool isHW(int num)
{
	int t = num, r = 0;
	while (num)
	{
		r = r * 10 + num % 10; // 让r为num的逆序 
		num /= 10;	
	}	
	if (r == t)
		return true;
	else
		return false;
} 


// 判断是否为ABAB BABA
bool isAB(int s)
{
	bool flag = false;
	int y, m, d;
	y = s / 10000;   // 得到年份 
	m = (s/100) % 100; // 得到月份  (BA)
	d = s % 100;  // 得到日  (BA)
	
	int k, n;
	k = y / 100;  // AB 
	n = y % 100; // AB 
	if (k == n && m == d)  // 判断是否为ABABBABA 
	{
		flag = true;
	}
	return flag;
} 


int main()
{
	int n;
	cin >> n;
	int t = n;
	int i = 0, j = 0;
	while (!i) // 找到后就退出 
	{
		t++;
		if (isDate(t)) // 首先判断是否为正常日期 
		{
			if (isHW(t)) // 再判断是否为回文日期 
			{
				i = t;
			}
		}
	}
	t = i - 1; // 从回文日期前一天查找 
	while (!j)
	{
		t++;  // 找到的回文日期 
		if (isDate(t))
		{
			if (isHW(t))
			{
				if (isAB(t)) // 判断回文日期是否满足ABABBABA 
				j = t;
			}
		}
	}
	cout << i << endl; // 输出回文日期 
	cout << j << endl; // 输出满足ABABBABA的回文日期 
	return 0; 
} 

若大家对上述代码有疑问的,欢迎评论或者私聊我!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值