USACO dualpal错误:段违规

问题描述:

虽然这个程序(双回文)提交给USACO网站,我收到一条错误信息,说
“运行3:执行错误:你的程序(`dualpal')与 信号#11退出(分段冲突[可能是因为访问 内存越界,数组索引超出界限,使用错误的 指针(失败的open(),失败的malloc)或超过指定的最大内存限制])。在信号之前为0.011 CPU秒 ,它使用了4184 KB的内存。“
有人能帮我解决这个问题吗? 在此先感谢:)USACO dualpal错误:段违规

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

问题: 一个从右到左阅读相同的数字,当从左到右阅读时称为回文。 数字21(基数10)不是基数10中的回文数,但数字21(基数10)实际上是基数2(10101)中的回文数。 编写一个程序,读取两个数(以10为基数表示): N(1 < = N < = 15) S(O <小号< 10000) ,然后查找并打印(在基体10)的前N个编号严格大于S,当写在两个或更多数字基地(2 < =基地< = 10)时是回文。 此问题的解决方案不需要操纵大于标准32位的整数。

我的代码:

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

    } 
+0

这就是为什么调试器存在。为(; POW(基数,EXP) OldProgrammer

+0

@OldProgrammer此代码适用于我的电脑,但是当我将它提交给USACO网站时,会出现错误。 –

简单地增加myOwnItoa函数的返回数组的大小可以解决问题..

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