找到下一个最大的回文数

时间:2016-02-07 08:15:56

标签: c++ algorithm palindrome

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

我的问题是我尝试过geekforgeeks和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/

2 个答案:

答案 0 :(得分:0)

我没有调试你的代码(你没有要求它,我认为它应该由你完成)但是对于以下输入我得错了答案:

Input: 9 (expected output 11)
Output: :

祝你好运:)

答案 1 :(得分:0)

由于这是一个算法问题,我会尝试保持语言中立。

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