解题思路:

先构造回文日期与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.0分

12 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 7 条评论

青禾 1年前 回复TA
有点迷,感觉我脑子不够用了
prprpr 1年前 回复TA
感谢思路,但是存在一个致命的问题,没有判断x与n是否相等,如果不判断一个样例都过不了
泡面与六 2年前 回复TA
思维好厉害
半秃小宝贝 2年前 回复TA
大佬,我有点不懂,那个i++循环,不是循环到9000和90就好了吗
半秃小宝贝 2年前 回复TA
大佬,我有点不懂,那个i++循环,不是循环到9000和90就好了吗
CodeRookie 2年前 回复TA
@打碎一池星月 多了一个等号,已改,感谢指正
打碎一池星月 3年前 回复TA
那个月份13是怎么回事?