2014-07-20 10 views
9

Ich versuche, eine Nummer einzugeben, n und die kleinste Superglückszahl, die mehr als oder gleich n ist. Super Glück: Es ist Dezimal-Darstellung enthält die gleiche Anzahl der Ziffern 4 und 7. Zum Beispiel sind die Zahlen 47, 7744, 474477 super glücklich und 4, 744, 467 sind nicht.Debug-Fehler -Abort() wurde aufgerufen

Hier ist mein Code

 #include<iostream> 
    #include<string> 
    using namespace std; 

    void superLucky(int n,string s, int count4, int count7) 
    { 
     if (s.size() > 10) 
      return; 
     if ((stoi(s) >= n) && (count4 == count7) && (count4+count7)!=0) 
     { 
      cout << s << endl; 
      return; 
     } 

     superLucky(n, s + '4', count4+1, count7); 
     superLucky(n, s + '7',count4,count7+1); 
    } 

    int main() 
    { 
     int n; 
     cin >> n; 
     superLucky(n, "", 0, 0); 
     return 0; 
    } 

Sobald ich Eingabe einige Integer-Debug-Fehler R6010 erhalten - abbrechen() aufgerufen wurde. Was das bedeutet? und wie kann ich das beheben?

+0

Es bedeutet, was es sagt; Die 'Abbruch'-Funktion wurde aufgerufen. Hängen Sie einen Debugger an und sehen Sie, wo er aufgerufen wurde. –

+0

Es heißt bei der zweiten, wenn Bedingung – MNada

Antwort

4

Es gibt einige Probleme:

  1. Wenn Sie superLucky von main nennen, s ist leer. stoi(s) löst eine Ausnahme aus, wenn s leer ist.

  2. Die Überprüfung s.size() > 10 ist nicht robust. Es ist plattformabhängig. Sie können einen try/catch Block verwenden, um damit umzugehen, anstatt eine Größe hart zu codieren.

Hier ist eine robustere Version der Funktion.

void superLucky(int n,string s, int count4, int count7) 
{ 
    int d = 0; 
    if (s.size() > 0) 
    { 
     try 
     { 
     d = stoi(s); 
     } 
     catch (...) 
     { 
     return; 
     } 

     if ((d >= n) && (count4 == count7) && (count4+count7)!=0) 
     { 
     cout << s << endl; 
     return; 
     } 
    } 

    superLucky(n, s + '7',count4,count7+1); 
    superLucky(n, s + '4', count4+1, count7); 
} 
+0

Es funktioniert jetzt gut. Danke). – MNada

+0

@ User3697826, Sie sind willkommen. –

0

Es ist wahrscheinlich, weil stoi() eine invalid_argument Ausnahme ausgelöst haben.

0

Beim ersten Aufruf an superLucky übergeben Sie eine leere Zeichenfolge an std::stoi. Wenn die Konvertierung nicht durchgeführt werden kann, löst stoi eine Ausnahme aus. Diese Ausnahme wird nicht gefangen, so uncaught_exception wird aufgerufen, was wiederum ruft abort

Verwandte Themen