2020第11届蓝桥杯C++B组(不确保答案正确性,仅供参考)2020蓝桥试题 G: 回文日期
发表时间:2020-10-17
发布人:葵宇科技
浏览次数:163
试题 G: 回文日期
时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
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
试题 G: 回文日期 9
第十一届蓝桥杯大赛软件类省赛第二场 C/C++ 大学 B 组
【评测用例规模与约定】
对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的
8 位数表示。
为防止查重系统误判,故暂时只能以图片示人
补充:非常感谢weixin_45803550这位朋友给我的代码找着了一个bug,在判断是否是ABABBABA这个地方,A与B应该不相等才是,不然就变成AAAAAAAA形式的回文串了,哎,又错了一道题,请大家引以为戒,不要再犯我这样的错误.因为月份一定小于12月,也就意味着,从10000101到11111110的测试点,我的答案都是错的.因为输出结果都有11111111
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
bool isRun(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
int day[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30,31,30, 31};
int getDay(int y, int m) {
if (m != 2) {
return day[m];
} else if (isRun(y)){
return 29;
} else {
return 28;
}
}
stringstream ss, s1, s2;
string getStr(int y, int m, int d) {
string str;
ss.clear();
s1.clear();
s2.clear();
string ans;
ss << y;
ss >> str;
int lenStr = str.length();
if (lenStr < 4) {
for (int i = 0; i < 4 - lenStr; i++) {
ans += '0';
}
}
ans += str;
s1 << m;
s1 >> str;
lenStr = str.length();
if (lenStr < 2) {
for (int i = 0; i < 2 - lenStr; i++) {
ans += '0';
}
}
ans += str;
s2 << d;
s2 >> str;
lenStr = str.length();
if (lenStr < 2) {
for (int i = 0; i < 2 - lenStr; i++) {
ans += '0';
}
}
ans += str;
return ans;
}
bool judgeHuiWen(string & str) {
return str[0] == str[7] && str[1] == str[6] && str[2] == str[5] && str[3] == str[4];
}
bool judgeABBA(string & str) { //ABABBABA
char A = str[0];
char B = str[1];
return A != B && str[0] == A && str[2] == A && str[5] == A && str[7] == A &&
str[1] == B && str[3] == B && str[4] == B && str[6] == B;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int N;
cin >> N;
int num = 0;
int startY = N / 10000;
int startM = N / 100 % 100;
int startD = N % 100;
// cout << startY << ' ' << startM << ' ' << startD << endl;
int y = startY;
string str;
bool flagHuiWen = false, flagAB = false;
while(y) {
for (int m = (y == startY? startM : 1); m <= 12; m++) {
for (int d = (y == startY? startD : 1) + 1; d <= getDay(y, m); d++) {
str = getStr(y, m, d);
if (!flagHuiWen && judgeHuiWen(str)) {
flagHuiWen = true;
cout << str << '\n';
}
if (!flagAB && judgeABBA(str)) {
flagAB = true;
cout << str << '\n';
}
if (flagHuiWen && flagAB) {
return 0;
}
}
}
y++;
}
return 0;
}