找到下一个最大的回文数

Find next largest palindrome number

本文关键字:回文 下一个      更新时间:2023-10-16

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

我的问题是我已经尝试过极客和spojtoolkit(也是我知道最接近回文的随机数)的测试用例,并得到了正确的答案。然而,SPOJ说错了答案。任何人都可以建议我的代码可能无法工作或在我的代码中可能更正的情况。

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;
}

问题是:http://www.spoj.com/problems/PALIN/

我没有

调试您的代码(您没有要求它,我认为无论如何都应该由您完成),但是对于以下输入,我得到了错误的答案:

Input: 9 (expected output 11)
Output: :

祝你好运修复它:)

由于这是一个算法问题,我将尽量保持语言中立。

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