[蓝桥杯2020初赛] 回文日期

题目描述
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

输入描述
输入包含一个八位整数 N,表示日期。
对于所有评测用例,10000101≤N≤89991231,保证 N 是一个合法日期的 8 位数表示。

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

示例
输入:
20200202
输出:
20211202
21211212

但在这里我自己写的代码放在官网只有50%的正确率,几个能想到的测试用例输入进去也都输出正确的值,有没有看看哪里出了问题?

#include 
#include 
#define N 9999
using namespace std;
int search(int x3,int x4);
void Hui1(long a,int *x,int *y);
int search1(int x1,int x2);
void Hui(long a,int *x,int *y);
int main()
{    
    int *yy11=NULL,*mm11=NULL;
    long a;
    cin>>a;
    Hui(a,yy11,mm11);
    Hui1(a,yy11,mm11);

    
    
    
    
}
void Hui(long a,int *x,int *y)
{
    
    int x1,x2,x3,x4,dd,yy,yy1,mm1,x5,x6;
    x1=a/10000000;
    x2=(a/1000000)%10;
    x3=(a/100000)%10;
    x4=(a/10000)%10;
    x5=a%10000;
    x6=1000*x4+100*x3+10*x2+x1;
    if(x6>x5) x4--;
    int mm=search(x3,x4);
    yy=10*x1+x2;
    if(mm>=100)
    {
        x3=0;
        x4=0;
        mm=search(x3,x4);
        yy=search1(x1,x2);
    }
    if(mm<10)
    printf("%d0%d",yy,mm);
    else if(yy<10)
    printf("0%d%d",yy,mm);
    else if(mm<10&&yy<10)
    printf("0%d0%d",yy,mm);
    else
    printf("%d%d",yy,mm);

    x1=yy/10;

    x2=yy%10;

    x3=mm/10;

    x4=mm%10;

    yy1=x2*10+x1;

    mm1=x4*10+x3; 
    if(x2==0&&x4!=0) printf("%d0%d\n",mm1,yy1);
    else if(x4==0&&x2!=0) printf("0%d%d\n",mm1,yy1);
    else if(x2==0&&x4==0) printf("0%d0%d\n",mm1,yy1);
    else printf("%d%d\n",mm1,yy1);

    
}
void Hui1(long a,int *x,int *y)
{
    for(int i=0;ix1=a/10000000;
    x2=(a/1000000)%10;
    x3=(a/100000)%10;
    x4=(a/10000)%10;
    x5=a%10000;
    x6=1000*x4+100*x3+10*x2+x1;
    if(x6>x5) x4--;
    int mm=search(x3,x4);
    yy=10*x1+x2;
    if(mm>=100)
    {
        x3=0;
        x4=0;
        mm=search(x3,x4);
        yy=search1(x1,x2);
    }
    if(mm==yy)
    {
    if(mm<10)
    printf("%d0%d",yy,mm);
    else if(yy<10)
    printf("0%d%d",yy,mm);
    else if(mm<10&&yy<10)
    printf("0%d0%d",yy,mm);
    else
    printf("%d%d",yy,mm);

    x1=yy/10;

    x2=yy%10;

    x3=mm/10;

    x4=mm%10;

    yy1=x2*10+x1;

    mm1=x4*10+x3; 
    if(x2==0&&x4!=0) printf("%d0%d\n",mm1,yy1);
    else if(x4==0&&x2!=0) printf("0%d%d\n",mm1,yy1);
    else if(x2==0&&x4==0) printf("0%d0%d\n",mm1,yy1);
    else printf("%d%d\n",mm1,yy1);
    break;
    }
    else {
    a=a+10000;
    continue;
    }}
    
}

int search(int x3,int x4)
{
    x4++;
    int mm=0,mm1=0; 
    for(int i=0;imm=10*x3+x4;
        mm1=10*x4+x3;

        if(mm1<=12)
        break;
        else
        {
            int mm2=mm;
            mm2++;
            x3=mm2/10;
            x4=mm2%10;
    }
    }
    return mm;
}
int search1(int x1,int x2)
{
    x2++;
    int yy=0,yy1=0; 
    for(int i=0;iyy=10*x1+x2;
        yy1=10*x2+x1;

        if(yy1<=30)
        break;
        else
        {
            int yy2=yy;
            yy2++;
            x1=yy2/10;
            x2=yy2%10;
    }
    }
    return yy;
}



#include<iostream>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
int nian[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 
int main()
{
    int n;
    cin>>n;
    n/=10000;
    n++;
    
    string a1,a2;
    int flag1=0,flag2=0;
    for(int i=n;i<9999;i++)
    {
        string a=to_string(i);
        int mm,dd;
        mm=(a[3]-'0')*10+a[2]-'0';
        dd=(a[1]-'0')*10+a[0]-'0';
//        cout<<i<<' '<<mm<<' '<<dd<<endl;2
        
        if(i%4==0&&i%100!=0||i%400==0)
        nian[3]=29;
        else 
        nian[3]=28;
        
        if(mm>0&&mm<=12&&dd<=nian[mm])
        {
            if(flag1==0)
            {
                a1=a;
                reverse(a.begin(),a.end());
                a1+=a;
                flag1=1;
            }
            if(dd==mm&&flag2==0)
            {
                a2=a;
                reverse(a.begin(),a.end());
                a2+=a;
                flag2=1;
            }
        }
        if(flag1&&flag2)
        break;
    }
    cout<<a1<<endl;
    cout<<a2;
}

https://blog.csdn.net/fakerzhang/article/details/123943254