Integer einlesen und die Anzahl der Inversionen berechnen



  • Schreiben Sie ein Programm, das eine ganze Zahl einliest und die Anzahl der Inversionen
    in der eingegebenen Zahl ausgibt. Als Inversionen für eine bestimmte Ziffer (Ausgangsziffer)
    der Zahl bezeichnen wir alle Ziffern, die in der Zahl nach der Ausgangsziffer stehen
    und kleiner sind als diese. Zum Beispiel:
    Eingabe: 53278 Ausgabe: 3
    Da 3 hinter 5 steht, 2 hinter 5 steht und 2 hinter 3 steht.

    Bitte um Tips wie ich das lösen kann.
    LG
    Markus



  • Um die Ziffern der Zahl in irgendeinem iterierbaren Container zu haben, könntest du sie in einen String umwandeln oder mit modulo in einen int-vector oder so bringen.
    Dann eine äußere Schleife, die von vorne ziffenweise durchgeht und eine innere Schleife, die von der aktuellen Position nach hinten die kleineren aufaddiert.



  • Ab in einen Container mit den Ziffern.



  • bin echt auf den Tag gespannt, wo du deine Prüfung / Test schreiben musst. Hoffentlich hast du da Internet und es ist jemand hier.



  • Was ich dir sagen kann, ist, dass du am Besten die Zahl in einen std::string konvertieren solltest, damit du einfach auf die einzelnen Stellen zugreifen kannst.
    Dann kannst du sie in ein std::valarray<int> kopieren und damit Rechnungen anstellen: Folgendes Beispiel:

    7658359

    Stellen für Position 0 (1. Ziffer von links): Position 1 (2. von links), 2, 4, 5 -> Gesamtzähler = 4
    ----rekursiv für Position 1 : Positionen 2, 4 und 5 werden überprüft und dürfen nicht mehr in der obersten Rekursionsstufe überprüft werden. -> Gesamtzähler = 7
    --------rekursiv für Position 2: Position 4 wird überprüft; darf nicht mehr in Rekursion für Position 1 überprüft werden -> Gesamtzähler = 8
    ------------rekursiv für Position 4: keine Ergebnisse -> Gesamtzähler = 8
    --------rekursiv für Position 5: keine Ergebnisse -> Gesamtzähler = 8



  • Dobi schrieb:

    Um die Ziffern der Zahl in irgendeinem iterierbaren Container zu haben, könntest du sie in einen String umwandeln oder mit modulo in einen int-vector oder so bringen.
    Dann eine äußere Schleife, die von vorne ziffenweise durchgeht und eine innere Schleife, die von der aktuellen Position nach hinten die kleineren aufaddiert.

    Modulo? Minus!



  • #include <list>
    using namespace std;
    int main()
    {
    	int wert( 1234567 );
    	list<int> liste;
    	while ( wert )
    	{
    		liste.push_front( wert % 10 ); // modulo ;-)
    		wert /= 10;
    	}
    	return 0;
    }
    


  • Bitte um Tips wie ich das lösen kann.

    -> "Schreiben Sie ein Programm", die Grundzüge davon sollten dir inzwischen bekannt sein.

    -> "das eine ganze Zahl einliest", dazu gibts auch genügen Threads und Tutorials, wenn du nicht grade alles bisher blind abgetippt hast, ist das kein Thema für dich.

    -> "und die Anzahl der Inversionen in der eingegebenen Zahl ausgibt.", damit dürfte die Summe der Invasionen für jede Ziffer gemeint sein. Wie man das für eine einzelne Ziffer ausrechnet, steht da. Wie man das für jede Ziffer ausrechnet, sollte trivial sein. Wie man die Summe der Berechnungen bildet, erst recht. Wo ist das Problem? Die Zahl in ihre Ziffern zu zerlegen?

    Deine Frage verstößt hier ganz klar gegen die Regel "Eigeninitiative". Dadurch dass du schon eine Weile hier deien Fragen stellst, solltest du diese Regel jetzt allmählich kennen. Um den Gutmeinenden hier zu ersparen, weiter so schamlos von dir ausgenutzt zu werden, sperre ich den Thread. Stelle bitte ordentliche Fragen, die auch zeigen, dass du gewillt bist, selbst etwas zu deinen Hausaufgaben beizusteuern, dann wird dir auch geholfen.



  • #include <vector>
    
    int main()
    {
        using namespace std;
        int wert=1234567;
        vector<int> vec;
        do
        {
            vec.push_back(wert%10);
            wert/=10;
        }while(wert!=0);
    }
    

Anmelden zum Antworten