解题思路:
先构造回文日期与ABABBABA形日期,再判断日期是否合法
如何构造回文日期:
假设输入的日期为 n
取 n 的前四位为 x,即 x = n / 10000
将 x 反转后接在 x 的后面就构造了一个回文日期,即 x * 10000 + reverse(x)
然后判断这个回文日期是否合法,若不合法就令 x++ 继续构造回文日期
例如 n = 20200202,则前四位 x = 2020,反转 x 为 202
构造回文日期为 2020 * 10000 + 202 = 20200202
日期合法但不大于 n,使 x += 1 循环以上步骤
如何构造ABABBABA形日期:
与构造回文日期类似,只要取前两位就能构造,就不多说了
参考代码:
#include <bits/stdc++.h>
using namespace std;
//出现02月29时,年份只能是9220,一定合法,不必判断闰年
int days[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int n;
int reverse_num(int x) { //反转整数
int ret = 0;
while (x) {
ret = ret * 10 + x % 10;
x /= 10;
}
return ret;
}
bool check(int x) { //检查日期是否合法
if (x <= n) return false;
int dd = x % 100;
x /= 100;
int mm = x % 100;
return mm > 0 && mm < 13 && dd <= days[mm];
}
int main() {
cin >> n;
for (int i = n / 10000; i <= 9999; i++) { //取前四位构造回文日期
int x = i * 10000 + reverse_num(i);
if (check(x)) {
cout << x << endl;
break;
}
}
for (int i = n / 1000000; i <= 99; i++) { //取前两位构造 ABABBABA 形日期
int x = i * 1000000 + i * 10000 + reverse_num(i) * 100 + reverse_num(i);
if (check(x)) {
cout << x << endl;
break;
}
}
return 0;
}0.0分
12 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复