2017-05-25 4 views
-1

Der folgende Cryptarithmus ist ein Multiplikationsproblem, das gelöst werden kann, indem Ziffern aus einem angegebenen Satz von N Ziffern in die mit * markierten Positionen gesetzt werden. Wenn die Menge der Primzahlen {2,3,5,7} ausgewählt ist, wird der Kryptarithmus PRIME CRYPTARITHM genannt. Beispiel:Ausgabefehler: verschiedene Ausgaben auf zwei verschiedenen Compilern: Prime Cryptarithm USACO

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

Diese Sterne nur durch eine definierte Menge der ganzen Zahlen N ersetzt werden können, die durch die USACO grader gegeben. Die Teilprodukte müssen dreistellig sein.

Daten gegeben:

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

Die Aufgabe ist es, die Anzahl der möglichen Ergebnisse und geben die Zahl zu berechnen.

Meine Frage: In meinem Compiler, Die Ausgabe ist 0, das ist richtig, aber in der USACO Grader mein Programm gibt 1. Ich bin nicht in der Lage zu identifizieren, was das Problem ist. Könnte jemand mir helfen, dieses Problem zu lösen? Vielen Dank im Voraus.

MEIN PROGRAMM CODE:

#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"; 
} 

Antwort

0

Im Allgemeinen, wenn die Ergebnisse eines Programms unterschiedlich sind mit verschiedenen Compilern, dass in der Regel irgendwo in Ihrem Programm bedeutet, dass Sie in nicht definiertes Verhalten ausgeführt werden.

In Ihrem Fall ist der Vergleich von j<=numofDigs in checkNum falsch. Sie greifen nach dem Ende von arrSetN, wenn j==numofDigs. Da dies nicht definiert ist, können Sie unterschiedliche Ergebnisse erhalten.

Es kann andere ähnliche Orte geben, aber das ist der, den ich bemerkt habe.

+0

Genau das war das Problem. Ich weiß nicht, wie ich es verpasst habe. Vielen Dank! –

Verwandte Themen