cpp

时间:2018-02-18 06:01:14

标签: c++

当我编译以下代码(SPOJ上的PALIN问题)时,我收到SIGABRT错误。代码的目的是找到最小的回文数,该数应该大于给定的数字,其中给定的数字可以高达1000000数字。 该问题的链接是:http://www.spoj.com/problems/PALIN/它在代码块上运行良好,但SPOJ返回SIGABRT错误。有人能解释一下原因吗?

#include<iostream>
#include<string>
using namespace std;
string palinodd(string num)//to find next nearest palindrome for an odd digit number
{
    string palin=num;
    int flag=0;
    for(int i=num.size()/2-1;i>-1;i--)
    {
        if(flag==0)//checks if the middle most digit should be incremented
        {
            if(num[i]<palin[num.size()-i-1])
                flag=1;
            else if(num[i]>palin[num.size()-i-1])
                flag=-1;
        }
        palin[num.size()-1-i]=num[i];
    }
    if(flag!=-1)
        palin[num.size()/2]++;
    if(palin[num.size()/2]==':')//if the middle digit goes greater than 9
    {
        palin[num.size()/2]='0';
        palin[num.size()/2-1]++;
        palin[num.size()/2+1]++;
    }
    return palin;
}
string palineve(string num)//to find next nearest palindrome for an even digit number
{
    string palin=num;
    int flag=0;
    for(int i=num.size()/2-1;i>-1;i--)
    {
        if(flag==0)//checks if middle digit should be incremented
        {
            if(num[i]<palin[num.size()-i-1])
                flag=1;
            else if(num[i]>palin[num.size()-i-1])
                flag=-1;
        }
        palin[num.size()-1-i]=num[i];
    }
    if(flag!=-1)
        palin[num.size()/2-1]++;
    if(palin[num.size()/2-1]==':')//if the middle digit goes greater than 9
    {
        palin[num.size()/2-2]++;
        palin[num.size()/2+1]++;
        palin[num.size()/2-1]='0';
    }
    palin[num.size()/2]=palin[num.size()/2-1];//updates the middle number
    return palin;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string num="912496394";
        string ans;
        if(num.size()%2!=0)
            ans=palinodd(num);
        else
            ans=palineve(num);
        cout<<ans<<endl;
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

感谢您的努力,尝试匹配c ++编译器,SPOJ中的版本和代码块。在将num(912496394)更改为字符串后,我尝试使用clang ++ - 5.0编写代码,但我没有得到预期的结果。我想您可能已发布旧版本的代码,如果可能,您可以发布更新的代码。

如果您的代码中有任何溢出,则使用SIGABRT中止该过程,因为您正在使用更多字符串操作,您可以参考下面的链接,其中包含SIGABRT的一些信息, SIGABRT called when calling find() on a string element in an array

关于您解决问题的方法的一个建议,您可以尝试在while循环中将输入增加1,直到找到回文或达到最大数字并打印结果

答案 1 :(得分:1)

我发现上述问题的解决方案是:

#include<iostream>
#include<string>
using namespace std;
string palinodd(string num)
{
    string palin=num;
    int flag=0;
    for(int i=num.size()/2-1;i>-1;i--)
    {
        if(flag==0)
        {
            if(num[i]<palin[num.size()-i-1])
                flag=1;
            else if(num[i]>palin[num.size()-i-1])
                flag=-1;
        }
        palin[num.size()-1-i]=num[i];
    }
    if(flag!=-1)
        palin[num.size()/2]++;
    if(palin[num.size()/2]==':')
    {
        palin[num.size()/2]='0';
        palin[num.size()/2-1]++;
        palin[num.size()/2+1]++;
    }
    for(int i=num.size()/2-1;i>0;i--)
    {
        if(palin[i]==':')
        {
            palin[i]='0';
            palin[i-1]++;
        }
    }
    for(int i=num.size()/2+1;i<num.size()-1;i++)
    {
        if(palin[i]==':')
        {
            palin[i]='0';
            palin[i+1]++;
        }
    }
    return palin;
}
string palineve(string num)
{
    string palin=num;
    int flag=0;
    for(int i=num.size()/2-1;i>-1;i--)
    {
        if(flag==0)
        {
            if(num[i]<palin[num.size()-i-1])
                flag=1;
            else if(num[i]>palin[num.size()-i-1])
                flag=-1;
        }
        palin[num.size()-1-i]=num[i];
    }
    if(flag!=-1)
        palin[num.size()/2-1]++;
    if(palin[num.size()/2-1]==':')
    {
        palin[num.size()/2-2]++;
        palin[num.size()/2+1]++;
        palin[num.size()/2-1]='0';
    }
    palin[num.size()/2]=palin[num.size()/2-1];
    /*if any incremented digit becomes greater than 9,it shows a ':' so we make it 0 and increase previous(if ':' comes in the first half of the string)/next(if ':' comes in the last half of the sting) digit by 1.*/
    for(int i=num.size()/2-2;i>0;i--)
    {
        if(palin[i]==':')
        {
            palin[i]='0';
            palin[i-1]++;
        }
    }
    for(int i=num.size()/2+1;i<num.size()-1;i++)
    {
        if(palin[i]==':')
        {
            palin[i]='0';
            palin[i+1]++;
        }
    }
    return palin;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string num,ans;
        cin>>num;
        int cnt=0;
        /*if all the digits in the string are 9, then the next palindromic number will have one more digit than the original number of digits. Thus, increasing the string length*/
        for(int i=0;i<num.size();i++)
        {
            if(num[i]=='9')
                cnt++;
        }
        if(cnt==num.size())
        {
            num[0]='1';
            for(int i=1;i<num.size();i++)
                num[i]='0';
            num+='0';
        }
        if(num.size()%2!=0)
            ans=palinodd(num);
        else
            ans=palineve(num);
        cout<<ans<<endl;
    }
    return 0;
}