2017-05-09 1 views
0

USACOのウェブサイトにこのプログラム(デュアル回文を)提出しながら、私は
「ファイル名を指定して実行3というエラーメッセージを受信(セグメンテーション違反[ のメモリが範囲外にアクセスした、配列のインデックスが範囲外である、無効なopen()、失敗したmalloc)を使用しているか、最大 指定されたメモリ制限を超えています]信号の前に0.011のCPU秒の間 。それは4184 KBのメモリを使用しました。
誰かがこの問題を解決するのを手伝ってもらえますか? ありがとうございます。USACO dualpalエラー:実行時エラー:あなたのプログラム( `dualpal ') 信号#11で終了しましたセグメンテーション違反

他のテストやプログラム(4184 KB)と同じ量のメモリを使用するため、メモリの問題ではないと思います。

質問: 左から右に読み取ったときと同じように右から左に読み取る番号を回文といいます。 数字21(基数10)は基数10では回文ではありませんが、実際に基数2(10101)の数字21(基数10)は回文です。 (ベース10で表される)2つの数値を読み出し、プログラムを書く Nを(1 < = N < = 15) S(0 < S < 10000)を と認めると(ベース10)印刷最初のN個2つ以上の数の基数で書かれたときに回文的であるSよりも厳密に大きい(2 < =ベース< = 10)。 この問題を解決するには、標準の32ビットより大きい整数を操作する必要はありません。

MY CODE:

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

デバッガが存在する理由です。 for(; pow(radix、exp)<= num; exp ++); – OldProgrammer

+0

@OldProgrammerこのコードは私のPCで動作しますが、USACOのウェブサイトに送信すると、エラーが発生します。 –

答えて

0

単にmyOwnItoa機能に戻り、配列のサイズを大きくしても問題が解決し...

char *returnArr; 
returnArr=new char[20] //instead of 12 
関連する問題