C++ 查找下一个最大回文数

C++ 查找下一个最大回文数,c++,algorithm,palindrome,C++,Algorithm,Palindrome,我编写了下面的程序来查找每个输入的数字最近的最大回文。第一行输入要输入的整数数 我的问题是我在GeekForgeks和spojtoolkit(也是我知道的最近回文的随机数)上尝试过测试用例,并且得到了正确的答案。然而,斯波吉的回答是错误的。任何人都可以建议我的代码可能不起作用的情况或我的代码中可能的更正 using namespace std; void evenmirror(char g[1000000],int n) { int k=n/2; for(int i=n/2-1;

我编写了下面的程序来查找每个输入的数字最近的最大回文。第一行输入要输入的整数数

我的问题是我在GeekForgeks和spojtoolkit(也是我知道的最近回文的随机数)上尝试过测试用例,并且得到了正确的答案。然而,斯波吉的回答是错误的。任何人都可以建议我的代码可能不起作用的情况或我的代码中可能的更正

using namespace std;
void evenmirror(char g[1000000],int n)
{
    int k=n/2;
    for(int i=n/2-1;i>=0;i--)
    {
        g[k]=g[i];
        k++;
    }
    cout<<g;
}
void oddmirror(char g[1000000],int n)
{
    int k=n/2+1;
    for(int i=n/2-1;i>=0;i--)
    {
        g[k]=g[i]; k++;
    }
    cout<<g;
}
int main()
{
    int n,i,j,m;
    char g[1000000];
    cin>>m;
    for(int t=0;t<m;t++)
    {
        cin>>g;
        n=strlen(g);
       if(n==1 && g[0]!='9'){cout<<++g[0]; continue;}//single digits except9
        int s=0;
        int h=0;
        if(g[0]=='9' && g[n-1]=='9')
        {
            for(i=0;i<n;i++)
            {
                if(g[i]=='9') {h++; }
            }
            if(h==n)
            {
                for(i=0;i<=n;i++)
                {
                    if(i==0 || i==n) { cout<<1;}
                    else {cout<<0;}
                }
                s=1;
            }
        }
        if(n%2==0 && s==0)
        {
            i=n/2-1; j=n/2;
            while(g[i]==g[j] && i>0)
            {
                i--; j++;
                if(i==0){break;}
            }
            //if palindrome
            if(j==n-1 && g[j]==g[i])
            {
                if(g[n/2-1]<'9'){ g[n/2-1]++; }
                else if(g[n/2]=='9'){(g[n/2-1])='0'; g[n/2-2]+=1;}
                evenmirror(g,n);
            }//if even string is not palindrome
            else
            {
                if(g[i]<g[j])
                {
                    if(g[n/2-1]<'9'){ g[n/2-1]++; }
                    else if(g[n/2]=='9'){ g[n/2-1]='0';  g[n/2-2]+=1;}
                    evenmirror(g,n);
                }
                else{ evenmirror(g,n);  }
            }
        }
        //if odd number string
        else if(n%2!=0 && s==0)
        {
            i=(n/2)-1; j=(n/2)+1;
            while(g[i]==g[j] && i>0)
            {
                i--; j++;
            }
            //if palindrome
            if(j==n-1 && g[j]==g[i])
            {
                if(g[n/2]<'9'){ g[n/2]++; }
                else if(g[n/2]=='9'){  g[n/2]='0'; g[n/2-1]+=1;}
                oddmirror(g,n);
            }//if odd not palindrome
            else
            {
                char k=n/2+1;
                if(g[i]<g[j])
                {
                    if(g[n/2]<'9'){ g[n/2]++; }
                    else if(g[n/2]=='9'){(g[n/2])='0'; g[n/2-1]+=1;}
                    oddmirror(g,n);
                }
                else{ oddmirror(g,n);   }
            }
        }
        cout<<endl;
    }
    return 0;
}
使用名称空间std;
void evenmirr(字符g[1000000],整数n)
{
int k=n/2;
对于(int i=n/2-1;i>=0;i--)
{
g[k]=g[i];
k++;
}
库特;
n=strlen(g);
如果(n==1&&g[0]!='9'){cout我没有调试您的代码(您没有要求调试,我认为应该由您自己调试),但是对于以下输入,我得到了错误的答案:

Input: 9 (expected output 11)
Output: :

祝你好运:因为这是一个算法问题,我会尽量保持语言中立

  • 找到下一个回文的简单方法是不断测试,直到找到一个回文为止,一次一个地递增。这只是一个循环,一次递增一个,然后进行测试
  • 回文的测试非常简单。我认为将回文拆分为奇数和偶数两种情况使其过于复杂。您可以将数字转换为字符串,然后检查reverse()是否相同,这是整洁的(因为它在调用中),但需要内存,或者可以使用两个指针就地执行。一个指针位于字符串的开头,另一个指针位于字符串的结尾,每个指针都朝中间移动,条件是它们必须显示与另一个相同的字符,循环在它们都指向中间或切换了相对位置时结束

您的单个数字结果基于ASCII码,而不是数字的数值。这是一条注释,不是答案。@CareyGregory这正是OP要求的。