Ausgabe von Collatz Folge zählen



  • Hallo zusammen,
    ich bin Neuling und hoffe mein Post ist hier richtig.

    In Informatik haben wir die Aufgabe einen Code (C++) zu schreiben der die Collatz Folge beinhaltet.

    n/2
    3n+1

    Die Collatzfolge soll innerhalb von einer Million sein und man soll die längste Zahlenfolge für n herausfinden.

    Meine Frage:
    Wie zähle ich bei n=21

    64, 32, 16, 8, 4, 2, 1

    dass es sich bei der Zahl 21 um insgesamt 7 Zahlen handelt?

    Ich hoffe, dass ich mich nicht allzu kompliziert ausgedrückt habe.

    Danke im Voraus.

    MfG
    dfs



  • Was hast du denn schon? Weißt du grundsätzlich, wie man irgendwas zählt? Kannst du die Collatzfolge zu einer Startzahl (ohne Zählung) ausgeben?



  • 1+1+1+...



  • Bashar schrieb:

    Was hast du denn schon? Weißt du grundsätzlich, wie man irgendwas zählt? Kannst du die Collatzfolge zu einer Startzahl (ohne Zählung) ausgeben?

    Hallo,
    ja die Ausgabe meiner Collatzfolge funktioniert.

    Aber wie die Zählung meiner Ausgabe erfolgen soll, verstehe ich leider nicht so.

    Hier die Ausgabe zur Zahl 995173:
    Wie zähle ich nun die Anzahl der folgenden Zahlen? Es sind insgesamt 46 Zahlen.

    ---Count starts at 995173---
    2985520, 1492760, 746380, 373190, 186595, 559786, 279893, 839680, 419840, 209920, 104960, 52480, 26240, 13120, 6560, 3280, 1640, 820, 410, 205, 616, 308, 154, 77, 232, 116, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1,



  • Zeig mal Deinen Code.


  • Mod

    Ganz grob: Du definierst eine int -Variable und inkrementierst (addierst 1) diese in jedem Schleifendurchlauf. Du wirst eine Schleife haben, anders ist das kaum möglich (außer durch Rekursion, aber das kann man direkt umschreiben, und selbst da ist es in abgewandelter Form (mit Funktionsparameter) möglich).



  • volkard schrieb:

    Zeig mal Deinen Code.

    #include <iostream>
    using namespace std;
    
    int main () {
    
        long int n;
    
        for(int i=14; i<1000000;) {
    
            if(i%2==0) {
                n=i/2;
                cout << n << ", ";
            }
            else; {
                n=3*i+1;
                cout << n << ", ";
            }
            while(n!=1){
    
                if (n%2==0){
                    n=n/2;
                    cout << n << ", ";
                } else {
                    n=3*n+1;
                    cout << n << ", ";
                }
    
            }
            i++;
            cout << " \n";
            cout << " \n";
            cout << "---";
            cout << "Count starts at " << i << "---" "\n";
        }
    
    return 0;
    }
    

  • Mod

    Die Zeilen 10 bis 17 sind irgendwie unnötig, oder? Setz doch einfach n = i (und zieh das n in die Schleife).

    Zum Thema: Jetzt fügst du eine Variable hinzu, die du vor jedem Durchlauf deiner Folge (also vor Zeile 18) auf 0 setzt und dann im jedem Durchlauf der Schleife um 1 erhöhst. Wenn die Schleife fertig ist, kannst du am Zähler ablesen, wie oft sie durchlaufen wurde.



  • SeppJ schrieb:

    Die Zeilen 10 bis 17 sind irgendwie unnötig, oder? Setz doch einfach n = i (und zieh das n in die Schleife).

    Zum Thema: Jetzt fügst du eine Variable hinzu, die du vor jedem Durchlauf deiner Folge (also vor Zeile 18) auf 0 setzt und dann im jedem Durchlauf der Schleife um 1 erhöhst. Wenn die Schleife fertig ist, kannst du am Zähler ablesen, wie oft sie durchlaufen wurde.

    Vielen Dank für den Tipp, aber irgendwie zählt der nicht richtig. Hab den Code etwas geändert.

    #include <iostream>
    using namespace std;
    
    int main () {
    
        long int n;
        int m=0;
    
        for(int i=7; i<9;) {
    
            if(i%2==0) {
                n=i/2;
                cout << n << ", ";
            }
            else; {
                n=3*i+1;
                cout << n << ", ";
            }
            while(n!=1){
                m++;
                if (n%2==0){
                    n=n/2;
                    cout << n << ", ";
                } else {
                    n=3*n+1;
                    cout << n << ", ";
                }
            }
            cout << "\n";
            cout << m <<" Zahlen. " "\n";
            i++;
            cout << " \n";
            cout << " \n";
            cout << "---";
            cout << "Count starts at " << i << "---" "\n";
        }
    return 0;
    }
    

    Ausgabe bei Collatzfolge für 7:
    22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1,
    15 Zahlen.

    Ausgabe bei Collatzfolge für 8:
    ---Count starts at 8---
    4, 25, 76, 38, 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1,
    38 Zahlen.

    Bei der 1. Zahl zählt er um -1 und in der folgenden Collatzfolge zählt er zuviel ???


  • Mod

    Lies meinen Beitrag noch einmal genau. Wenn das nicht reicht, benutz einen Debugger.


Anmelden zum Antworten