Collatz Problem in C
-
Mach mal die Tabelle fertig:
ulam_max(1)= 1 Maximum: 1 ulam_max(2)= 2 1 Maximum: 2 ulam_max(3)= 3 10 5 16 8 4 2 1 Maximum: 16 ulam_max(4)= 4 2 1 Maximum: 4 ulam_max(5)= 5 16 8 4 2 1 Maximum: 16 ulam_max(6)= 6 3 10 5 16 8 4 2 1 Maximum: 16 ulam_max(7)= 7 22 11 34 17 52 26 13 40 20 10 5 Maximum: 52 ulam_max(8)= 8 4 2 1 Maximum: 8 ulam_max(9)= 9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 Maximum: 52 ulam_max(10)= 10 5 16 8 4 2 1 Maximum: 16
Kann das denn sein, das nur wenn beide Folgen die gleichen Maxima haben, dann auch Zwillinge haben können?
-
ne das ist auch quatsch, meit er vielleicht die 16 als Zwillinge?
Und a0 und a0 +1 nur als Startwert?Also dannwäre a0 = 5, a0 + 1 = 6 und 16 das Zwilling ?
-
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