2017-05-09 54 views
0

雖然這個程序(雙迴文)提交給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)<= NUM​​; EXP ++); – OldProgrammer

+0

@OldProgrammer此代碼適用於我的電腦,但是當我將它提交給USACO網站時,會出現錯誤。 –

回答

0

簡單地增加myOwnItoa函數的返回數組的大小可以解決問題..

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