Collatz Problem in C
-
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