USACO dualpal 错误:分段违规

Posted

技术标签:

【中文标题】USACO dualpal 错误:分段违规【英文标题】:USACO dualpal error : segmentation violation 【发布时间】:2017-05-09 09:21:39 【问题描述】:

在向 USACO 网站提交这个程序(双回文)时,我收到一条错误消息说 “运行 3:执行错误:您的程序 (`dualpal') 以 信号 #11(分段违规[可能是由于访问 内存超出范围,数组索引超出范围,使用错误 指针(open() 失败,malloc 失败),或超过最大值 指定的内存限制])。程序运行了 0.011 CPU 秒 在信号之前。它使用了 4184 KB 的内存。” 有人可以帮我解决这个问题吗? 提前致谢:)

我认为这不是内存问题,因为它使用的内存量与其他测试和程序相同 (4184 KB)。

问题: 一个从右到左读法与从左到右读法相同的数称为回文数。 数字 21(以 10 为底)不是以 10 为底的回文,但数字 21(以 10 为底)实际上是以 2(10101)为底的回文。 编写一个读取两个数字(以 10 为基数)的程序: N (1

我的代码:

//include all necessary header files
    using namespace std;

    struct DivResults
        
            int remainder;
            int quotient;
        ;

    DivResults remAndQuo(int numerator,int radix,int exponent)
    
        DivResults retVal;
        double a=numerator,b=radix,c;
        c=pow(b,exponent);
        int rPowi=c;
        retVal.remainder=numerator%rPowi;
        retVal.quotient=numerator/rPowi;
        return retVal;
    

    char *myOwnItoa(int num,int radix)
    
        char *returnArr,charQuotient;
        int exp=0,remainder,quotient,j=0;
        int rPowi;

        returnArr=new char[12];
        /*
            find max exponent of radix where it is just less than or equal to 
            num
        */
        for(;pow(radix,exp)<=num;exp++);
        exp--; // subtracting by 1 to cancel the extra increment in for loop
        /*
            iterate from max exponent to 0
            to convert each digit into its radix base.
        */
        for(;exp>=0;exp--)
        
            DivResults retVal=remAndQuo(num,radix,exp);
            charQuotient=retVal.quotient+'0';
            returnArr[j]=charQuotient;
            num=retVal.remainder;
            j++;
        
        returnArr[j]='\0';
        return returnArr;
    

    bool palindrome(char answer[])
    
        int n,x=0;
        for(x=0;answer[x]!='\0';x++);
        n=x;
        int i=0,j=n-1;
        if(n%2==0)
        
            int middle1=(n-1)/2;
            int middle2=(n+1)/2;
            while(i<=middle1 && j>=middle2)
            
                if(answer[i]!=answer[j])
                    return false;
                i++;
                j--;
            
            return true;
        

        else
        
            int middle=n/2;
            while(i<middle && j>middle)
            
                if(answer[i]!=answer[j])
                    return false;
                i++;
                j--;
            
            return true;
        
    

    int main()
    
        ofstream fout("dualpal.out");
        ifstream fin("dualpal.in");
        int n,s,check=0,palCheck=0,num;
        char *CharAnswerNum;
        fin>>n>>s;
        num=s+1;
        for(;check<n;)
        
            for(int base=2;base<=10;base++)
            
                CharAnswerNum=myOwnItoa(num,base);
                bool isPal=palindrome(CharAnswerNum);
                if(isPal==true)
                
                    palCheck++;
                
            
            if(palCheck>=2)
            
                fout<<num<<"\n";
                check++;
            
            num++;
            palCheck=0;
        

    

【问题讨论】:

这就是调试器存在的原因。 for(;pow(radix,exp) @OldProgrammer 此代码在我的电脑上运行,但当我将其提交到 USACO 网站时,出现错误。 【参考方案1】:

只需在 myOwnItoa 函数中增加返回数组的大小即可解决问题..

char *returnArr;
returnArr=new char[20] //instead of 12

【讨论】:

以上是关于USACO dualpal 错误:分段违规的主要内容,如果未能解决你的问题,请参考以下文章

分段错误与页面错误

什么是分段错误?

打印分段错误原因[重复]

分段控制错误选择索引

如何调试 Python 分段错误?

是啥导致发生分段错误?