回文日期

题目描述

给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

输入描述
输入n,\(10000101≤N≤89991231\),保证 N 是一个合法日期的 8 位数表示。

输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。

输入输出样例
示例
输入 :20200202
输出
20211202
21211212

运行限制
最大运行时间:1s
最大运行内存: 256M

思路:暴力

1e8暴力即可,注意判断日期的合法性

代码

#include <iostream>
#include <map>
#include <bits/stdc++.h>

using namespace std;
int rw(int x){
    int ans = 0;
    for (int i = 0; i < 4; i++){
        ans *= 10;
        ans += x % 10;
        x /= 10;
    }
    return ans;
}

map<int, int> mp = {{0, 1}, {3, 1}, {5, 1}};
bool judge(int x)
{
    int flag = 1;
    int a = x % 10;
    x /= 10;
    int b = x % 10;
    for (int i = 0; i < 6; i++)
    {
        x /= 10;
        int t = x % 10;

        if (mp[i] && t != a)
        {
            flag = 0;
            break;
        }
        if (!mp[i] && t != b)
        {
            flag = 0;
            break;
        }
    }
    if (flag)
        return true;
    else
        return false;
}
int solve(int x)
{
    int d = 0, m = 0, y = 0;
    y=x/10000;
    m = (x % 10000) / 100;
    d=x%100;

    if(m > 12 || m < 1)
        return false;
    if ((y % 100 && y % 4==0) || y % 400 == 0)
    {
        if (m == 2 && d > 29)
            return false;
    }
    else
    {
        if (m == 2 && d > 28)
            return false;
    }
    int dayInMonth[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    // cout<<m<<endl;
     if(d > dayInMonth[m] || d <= 0)
        return false;
   
    return true;
}
int main()
{
    int num;
    cin >> num;
    int a = num + 1;
    int b;
    for (; a < 100000000; a++)
    {
        if (a / 10000 == rw(a) && solve(a))
        {
            cout << a << endl;
            break;
        }
    }
    a = num + 1;
    for (; a < 100000000; a++)
    {
        if (judge(a) && solve(a))
        {
            cout << a << endl;
            break;
        }
    }
    return 0;
}
posted @ 2023-03-14 21:53  kingwzun  阅读(24)  评论(0编辑  收藏  举报