2017-05-25 16 views
-1

次の暗号化は、指定されたN桁の数字を*でマークされた位置に置き換えることで解決できる乗算問題です。素数の組{2,3,5,7}が選択されている場合、暗号はPRIME CRYPTARITHMと呼ばれます。例:出力エラー:2つの異なるコンパイラでの異なる出力:プライム暗号USACO

 * * * 
    x * * 
    ------- 
     * * *   <-- partial product 1 
    * * *   <-- partial product 2 
    ------- 
    * * * * 

これらの星は、USACOグレーダーによって与えられた定義された整数の組Nによってのみ置き換えることができます。 部分品は3桁でなければなりません。所与

データ:

4  /* <-- This is the given size of set N from which the multiplicand and multiplier is taken */ 
2 3 5 7 /* <-- Set N */ 

タスクが可能な結果および出力回数の数を計算することです。

質問: 私のコンパイラでは、出力は0ですが、USACOグレーダでは私のプログラムは1を出力します。問題の内容を特定できません。 誰かがこの問題を解決するのに役立つでしょうか? ありがとうございます。

MYプログラムコード:

一般
#include <iostream> 
#include <fstream> 

using namespace std; 

int *sortInput(int arrSetN[], int numofDigs) 
{ 
    for(int ictr=0;ictr<numofDigs;ictr++) 
    { 
     for(int jctr=ictr+1;jctr<numofDigs;jctr++) 
     { 
      if(arrSetN[ictr]>arrSetN[jctr]) 
      { 
       swap(arrSetN[ictr],arrSetN[jctr]); 
      } 
     } 
    } 
    return arrSetN; 
} 
bool checkNum(int num,int arrSetN[],int numofDigs) 
{ 
    int countDigits=0,tempNum=num,ictr=0,jctr=0; 
    int *arrDigits,*digitTally; 

    /* 
    Counting the number of digits in num.  
    */ 
    for(;tempNum>0;) 
    { 
     tempNum=tempNum/10; 
     countDigits++; 
    } 
    arrDigits=new int[countDigits]; 
    digitTally=new int[countDigits]; 

    /* 
     making digitTally = 0 
    */ 
    for(ictr=0;ictr<countDigits;ictr++) 
     digitTally[ictr]=0; 

    /* 
     retrieving the digits of num. 
    */ 
    for(ictr=0;ictr<countDigits;ictr++) 
    { 
     arrDigits[ictr]=num%10; 
     num=num/10; 
    } 

    /* 
     checking if all digits of num are part of set N. 
    */ 
    for(ictr=0;ictr<countDigits;ictr++) 
    { 
     for(jctr=0;jctr<=numofDigs;jctr++) 
     { 
      if(arrDigits[ictr]==arrSetN[jctr]) 
       digitTally[ictr]=1; 
     } 
    } 

    for(int cfc=0;cfc<countDigits;cfc++) 
    { 
     if(digitTally[cfc]==0) 
      return false; 
    } 
    return true; 
} 

int main() 
{ 
    ofstream fout("crypt1.out"); 
    ifstream fin("crypt1.in"); 
    int numofDigs,ictr=0,a,b,c,d, e,p1,p2,sum,p2test; 
    int actr=0,bctr=0,cctr=0,dctr=0,ectr=0,tally=0; 
    bool sumCheck,p1Check,p2Check; 
    fin>>numofDigs; 
    int *arrSetN; 
    arrSetN = new int[numofDigs]; 
    for(ictr=0;ictr<numofDigs;ictr++) 
    { 
     fin>>arrSetN[ictr]; 
    } 
    arrSetN=sortInput(arrSetN,numofDigs); 
    for(actr=0;actr<numofDigs;actr++) 
    { 
     a=arrSetN[actr]; 
     for(bctr=0;bctr<numofDigs;bctr++) 
     { 
      b=arrSetN[bctr]; 
      for(cctr=0;cctr<numofDigs;cctr++) 
      { 
       c=arrSetN[cctr]; 
       for(dctr=0;dctr<numofDigs;dctr++) 
       { 
        d=arrSetN[dctr]; 
        for(ectr=0;ectr<numofDigs;ectr++) 
        { 
         e=arrSetN[ectr]; 
         p1=((a*100)+(b*10)+c)*e; 
         p2=((a*1000)+(b*100)+(c*10))*d; 
         p2test=((a*100)+(b*10)+c)*d; 
         p1Check=checkNum(p1,arrSetN,numofDigs); 
         p2Check=checkNum(p2test,arrSetN,numofDigs); 
         if(p1>999 || p2test>999 || p1<100 || p2test<100) 
         { 
          continue; 
         } 
         sum=p1+p2; 
         sumCheck=checkNum(sum,arrSetN,numofDigs); 
         if(sumCheck==true && p1Check==true && p2Check==true) 
         { 
          tally++; 
          //fout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e; 
          //fout<<"\t"<<p1<<" "<<p2<<" "<<sum<<"\n"; 
         } 
        } 
       } 
      } 
     } 
    } 
    fout<<tally<<"\n"; 
} 

答えて

0

、プログラムの結果は通常、あなたは未定義の動作に実行されているプログラムのどこかを意味していること、異なるコンパイラと異なっています。

あなたのケースでは、j<=numofDigsのcheckNumの比較が間違っています。 j==numofDigsのときは、arrSetNの最後を過ぎてアクセスしています。これは未定義なので、異なる結果を得ることができます。

他にも同じような場所があるかもしれませんが、これは私が気づいた場所です。

+0

これはまさに問題の原因です。どのように私はそれを逃したのか分からない。ありがとう! –

関連する問題