CPP中的Sigabrt错误

SIGABRT error in cpp

本文关键字:错误 Sigabrt 中的 CPP      更新时间:2023-10-16

当我编译以下代码(SPOJ上的palin问题(时,我会遇到一个sigabrt错误。该代码的目的是找到最小的palindromic号码,该号码应该大于给定的数字,给定的数字最多可有1000000位数字。链接到问题是:http://www.spoj.com/problems/palin/它在CodeBlocks上运行良好,但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;
}

感谢您的努力,尝试匹配C 编译器,SPOJ和CodeBlocks中的版本。在将NUM(912496394(更改为字符串之后,我尝试了您的代码,但我没有得到预期的结果。我认为您可能已经发布了代码的较旧版本,如果可能的话,您可以发布更新的代码。

如果代码中有任何溢出,则该过程将被Sigabrt中止,因为您使用的是更多字符串操作,您可以在下面链接中引用有关Sigabrt上的一些信息,sigabrt在数组中的字符串元素上调用find((时

关于您解决问题方法的一个建议,您可以尝试在一段时间内将输入递增,直到找到回文或达到最大数量并打印结果

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

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