解题思路:
先构造回文日期与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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复