题目描述:
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 yyyymmdd 的格式写成一个 88 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是“千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年12 月12 日。算不上“千年一遇”,顶多算“千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入格式
输入包含一个八位整数 �N,表示日期。
输出格式
输出两行,每行 11 个八位数。第一行表示下一个回文日期,第二行表示下 一个 ABABBABA 型的回文日期。
输入输出样例
输入 #1复制
20200202
输出 #1复制
20211202
21211212
说明/提示
对于所有评测用例,10000101≤�≤9220022910000101≤N≤92200229,保证 �N 是一个合法日期的 88 位数表示。
蓝桥杯 2020 第二轮省赛 A 组 G 题(B 组 G 题)。
解题思路:
采用枚举的方法,以输入的时间点为起始位置,将其转化为年月日,一天一天进行累加,此处需要对日期进制进行简单处理,将回文类型和特殊ab类回文类型进行bool类型判断。最后通过两个while循环分别求出日期。需要注意年月的‘0’处理。
样例代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int getmonthday(int year, int month)//检查月份
{
int arr[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))
{
return 29;
}
else
{
return arr[month];
}
}
bool checkback(int year, int month, int day)//检查回文
{
int ge = year % 10;
ge = ge * 10;
int shi = year / 10 % 10;
int bai = year / 100 % 10;
bai = bai * 10;
int qian = year / 1000;
if (ge + shi == month && bai + qian == day)
{
return true;
}
else
{
return false;
}
}
bool checkabab(int year, int month, int day)//检查ababbaba类型回文
{
if (checkback(year, month, day) && month == day)
{
return true;
}
else
{
return false;
}
}
int main()
{
int n;
cin >> n;
int day = n % 100;
int month = n / 100 % 100;
int year = n / 10000;
while (!(checkback(year,month,day)))
{
day++;
if (day > getmonthday(year, month))
{
month++;
day = 1;
if(month > 12)
{
year++;
month = 1;
}
}
}
if (day < 10 && month < 10)
{
cout << year << "0" << month << "0" << day << endl;
}
else if (day < 10 && month >= 10)
{
cout << year << month << "0" << day << endl;
}
else if (day > 10 && month < 10)
{
cout << year << "0" << month << day << endl;
}
else
{
cout << year << month << day << endl;
}
while (!(checkabab(year, month, day)))
{
day++;
if (day > getmonthday(year, month))
{
month++;
day = 1;
if (month > 12)
{
year++;
month = 1;
}
}
}
if (day < 10 && month < 10)
{
cout << year << "0" << month << "0" << day << endl;
}
else if (day < 10 && month >= 10)
{
cout << year << month << "0" << day << endl;
}
else if (day > 10 && month < 10)
{
cout << year << "0" << month << day << endl;
}
else
{
cout << year << month << day << endl;
}
return 0;
}