CodeRookie


私信TA

用户名:Shmily124

访问量:133448

签 名:

清风前烹茶对弈,明月下把酒言欢

等  级
排  名 14
经  验 22966
参赛次数 7
文章发表 39
年  龄 0
在职情况 学生
学  校 ZUA
专  业 计科

  自我简介:

悄悄地秃头,然后惊艳所有人?

解题思路:

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

59 人评分

  评论区

有点迷,感觉我脑子不够用了
2023-03-14 11:09:58
感谢思路,但是存在一个致命的问题,没有判断x与n是否相等,如果不判断一个样例都过不了
2023-03-14 10:41:43
思维好厉害
2022-03-27 11:23:25
大佬,我有点不懂,那个i++循环,不是循环到9000和90就好了吗
2022-03-22 17:15:04
大佬,我有点不懂,那个i++循环,不是循环到9000和90就好了吗
2022-03-22 17:14:29
那个月份13是怎么回事?
2022-02-22 18:36:33
  • «
  • 1
  • »