Collatz Problem in C



  • ulam_max gibt nur das Maximum zurück.

    ulam_max(1)= 1
    ulam_max(2)= 2
    ulam_max(3)= 16
    ulam_max(4)= 4
    ulam_max(5)= 16
    ulam_max(6)= 16
    ulam_max(7)= 52
    ulam_max(8)= 8
    ulam_max(9)= 52
    ulam_max(10)= 16
    

    Kann das denn sein, das nur wenn beide Folgen die gleichen Maxima haben, dann auch Zwillinge haben können?

    Er nennt 5 und 6 einen Zwilling, weil ulam_max(5)==ulam_max(6).

    Als Rückgabe möchte er dann 5 haben, also den kleineren Zwillingspartner.



  • Hi

    ich Sitz auch Grade an der Aufgabe. Das mit den Twins geht recht einfach.

    if (ulam_max(i) == ulam_max(i + 1))
            {
                twin = i;
            }
    

    Da sind Wirklichkeit 2 gleiche Maxima gefragt die hintereinander liegen.

    Die Dritte Aufgabe bereitet mir aber Kopfschmerzen.

    Da sollen wir Mehrlinge finden.

    ulam_multiples(1000, 3)
    

    soll den wert 972 zurückgeben da 972,973 und 974 das gleiche Maxima haben. Erster Parameter steht fürs Limit bis zu dem gezählt wird und der 2. für die Anzahl Mehrlinge(2 = Zwillinge, 3 = Drillinge etc.).

    Da wir erst angefangen haben mit C komm ich grad gar nicht Klar.

    Erst wollte ich wenn nach Vierlingen gefragt war und ein Zwilling gefunden wurde einfach noch 2 mal ulam_twins(i + 2) ulam_twins(i + 3) ausführen und gucken ob die auch noch gleich sind. Weiß aber nicht wie ich jetzt explizit sagen kann führe funktion ulam_twins() 3 mal aus.

    Ah ist schon spät. Morgen mal ausführlicher aber vieleicht kann ja schon wer helfen.

    cu



  • if (ulam_max(i) == ulam_max(i + 1))
            {
                twin = i;
            }
    

    Was man mit Gewalt sogar noch functional zerlegen könnte in

    if (is_ulam_twin(i))
            {
                twin = i;
            }
    

    nebst

    bool is_ulajm_twin(int i)
    {
       if( ulam_max(i) == ulam_max(i + 1) )
          return true;
       else
          return flase;
    

    Da sollen wir Mehrlinge finden.

    Das geht leicht:

    if (is_ulam_mehrling(i,anz))
            {
                mehrling = i;
            }
    

    nebst

    //Funktion mit Schleife drin zur Übung freigelassen
    


  • Ui

    auch noch wach. Also erstmal alles ohne Gewähr(Schon das ein oder andere Bier vernichtet), zudem probier ich mal einfach bisschen rum.

    int ulam_multiples(int limit, int number)
    {
        int multiples[number];
        int i;
        int check = 0;
        int n = number - 1;
        for (i = 1; i < limit - n; i++)
        {
            if (ulam_max(i) == ulam_max(i + 1))
            {
                for ( n = 1; n <= number; n++ )
                {
                    if(ulam_max(i + 1) == ulam_max(i + 1 + n) )
                    {
                        multiples[n - 1] = i;
                    }
                    else
                    {
                        multiples[n - 1] = i + 1 + n;
                    }
                }
            }
        }
    
        for (i = 0; i < number; i++)
        {
            if(multiples[i] == multiples[i + 1])
            {
                check++;
            }
            else
            {
                check--;
            }
        }
    
        return (check == number - 1 ? multiples[0] : -1);
    }
    

    Da wurde jetzt auch schon ordentlich rumgefrickelt. Im moment geht rein gar nix.

    Vielen Dank für die schnelle und gehaltvolle Antwort! 👍

    cu



  • Ja die Twins Funktion war total leicht, als ich diese dann auch mal verstanden habe 😃
    zu den Mehrlinge:
    da würd mir glaub ich schon die twins Funktion zu nutze machen, da man ja einfach daraus schließen kann:
    keine Zwilinge = keine Mehrlinge!



  • wieso willst du es denn mit Arrays lösen?
    Habe es so gelöst:

    int ulam_multiples(int limit, int number)
    {
        int index = 1;
        int index2 = 1;
        int anz = number;
        int num;
        int multiples = -1;
    
        if (number == 2)
        {
            multiples = ulam_twins(limit);
        }
        else
        {
            for (index = 1; index < limit; index++)
            {
                if ((num = ulam_twins(index)) != -1)
                {
                    anz--;
                    for (index2 = index + 1; index2 < index + number; index2++)
                    {
                        if ((ulam_twins(index2) - (index2 - index)) == num)
                        {
                            anz--;
                        }
                        else if (anz == 1)
                        {
                            multiples = num;
                        }
                        else
                        {
                            anz = number;
                        }
                    }
                }
            }
        }
        return multiples;
    
    }
    

    Die Frage ist nur:
    wie geht es effizenter?
    Das ist noch nicht perfekt werde noch weiter basteln für Vorschläge bin ich natürlich sehr offen :-P...



  • bin mir absolut nicht sicher ob ich die beiden for-Schleifen in der Funktion brauche, wenn würde ich versuchen da zu reduzieren da ich ja auch noch in der Funnktion ulam_twins eine for-Schleife habe...
    aber wie gesagt absolut nicht sicher muss nochmal drüber gucken....

    PS: Falls jemand was sieht was blödsinn ist gerne melden 🙂



  • volkard schrieb:

    bool is_ulajm_twin(int i)
    {
       if( ulam_max(i) == ulam_max(i + 1) )
          return true;
       else
          return flase;
    
    bool is_ulajm_twin(int i)
    {
        return (ulam_max(i) == ulam_max(i + 1));
    }
    


  • llTodoll schrieb:

    Die Frage ist nur:
    wie geht es effizenter?

    Einen guten Entwurf vorausgesetzt, werden Programme richtig schnell, wenn man verzichtet, statt immer nur Sachen dranzuschrauben.

    lastmax=-1
    for i=1 to limit
      max=ulam_max(i)
      if max!=lastmax
        lastmax=max
        len=1
      else
        ++len
        if len>=number
           result=i-number+1
    


  • llTodoll schrieb:

    PS: Falls jemand was sieht was blödsinn ist gerne melden 🙂

    Hier ist er:

    llTodoll schrieb:

    da würd mir glaub ich schon die twins Funktion zu nutze machen, da man ja einfach daraus schließen kann:
    keine Zwilinge = keine Mehrlinge!

    oder im Code Zeile 9 bis 37. 🤡



  • Ja ok vestehe schon war ne scheiß Idee werde mich nochmal dran setzen danke für dein Tip 🙂



  • joa sieht auf jeden Fall wesentlich kürzer und effizenter aus.
    Vielen Dank für eure (deine) Hilfe.
    Bis ich da bin wo du bist dauerts wohl noch sehr sehr lange ^^

    Kann geschlossen werden.



  • llTodoll schrieb:

    Bis ich da bin wo du bist dauerts wohl noch sehr sehr lange

    Gar nicht so. Es gibt da Abkürzungen, wie
    Algorithmen in C | ISBN: 3893193766


Anmelden zum Antworten