试题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 位数表示。
主要思想
- 要判断找到的数据是否符合日期规范,其中包括年份,月份和日,另外年份是要大于0,月份大于0小于12,而天数则要根据年和月来确定这一年的这一月的天数,并进行判断;
- 要判断日期是否满足回文条件,这里本人的思想就是将数据的每一位找出来逆序和原数据进行比较 ,若相等则是回文;
- 要判断是否符合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;
}
若大家对上述代码有疑问的,欢迎评论或者私聊我!