Zahl rotieren
-
Hallo
Ich muss eine positive, nicht gleich große Ganzzahl rotieren lassen. Am besten erst mal ein Beispiel zur Veranschaulichung:
123456 -> 234561 -> 345612 -> 456123 -> 561234 -> 612345 -> 123456
Nun könnte ich das sicherlich einfach mit Stringoperationen machen, nur leider ist das wahrscheinlich zu langsam. Gibts da schnellere Möglichkeiten, z.B. mit Bitoperationen? Mir will nichts einfallen...
Gruß Vanish
-
nicht hübsch, aber geht wohl
int lzv(int n,int e){ if(n<10) return e; else return 10*lzv(n/10,e); } int rot(int n){ return n/10+lzv(n,n%10); }
ups, der rotiert ja falschrum.
int ezv(int n){ if(n<10) return n; else return 10*ezv(n/10); } int ez(int n){ if(n<10) return n; else return ez(n/10); } int rot(int n){ return 10*(n-ezv(n))+ez(n); }
-
etwa so
x = 10*x%1000000 + x/100000;
-
an die 1000000 von +fricky kommt man mit pow(10,floor(log10(n))) oder so.
-
volkard schrieb:
an die 1000000 von +fricky kommt man mit pow(10,floor(log10(n))) oder so.
ja, so etwa, wenn die anzahl der ziffern variabel ist:
int rotate (int x) { int zp = pow(10,(int)log10(x)); return 10*x%(10*zp) + x/zp; }
-
Noch eine Integer-Variante:
int rotate(int i) { int s = 1; while (s <= i) s *= 10; i *= 10; return i % s + i / s; }
-
Hey danke, das sieht ja super aus. Schaue es mir später an!
Warum habe ich nie die guten IdeenGruß Vanish
-
VanishOxiAction schrieb:
Warum habe ich nie die guten Ideen
naja, auf sowas wärste doch selbst gekommen. deine forderung 'schneller und mit bitoperationen' hat keiner erfüllt, aber es geht bestimmt: ohne schleifen, ohne modulo, ohne multiplikation usw. (aber dürfte dann ziemlich hässlich und unverständlich aussehen).
-
VanishOxiAction schrieb:
...
123456 -> 234561 -> 345612 -> 456123 -> 561234 -> 612345 -> 123456
Nun könnte ich das sicherlich einfach mit Stringoperationen machen, nur leider ist das wahrscheinlich zu langsam.
Kann man so pauschal nicht sagen, die Frage ist, ob Du die Zahl als Zahl brauchst, mit der man rechnen kann. Sonst könntest Du Deine Ur- Ziffernfolge in ein char- array schreiben und es als Ringbuffer mit Wanderanker in den Ausgabestring umkopieren, das geht viel schneller als die ganzen Rechnereien.
Pferdefuß der Sache :p : Um aus den Targetstrings Zahlen zu machen, brauchst Du atoi() und das ist üblicherweise kein Rennpferd.
-
So, jetzt hatte ich endlich Zeit es zu implementieren. Habe fricky's Variante gewählt, da ich hiermit auch Zahlen mit 0en behandeln kann. Bei der Zahl 101 würde das erste Aufruf von rotate zu 011 -> 11 führen. Jetzt werden alle Zahlen, welche eine 0 enthalten ausgeschlossen.
bool rotate(int& x) { int pot = log10((double)x); int base = pow(10.0f, pot); x = (10*x)%(10*base) + x/base; if ((int)log10((double)x) < pot) return false; return true; }
Danke und Gruß Vanish
-
VanishOxiAction schrieb:
bool rotate(int& x) ...
adressoperator im funktionskopf? das compiled nimmer nicht.