2 integer werte verbinden
-
Hello, hab ne frage soll ein programm schreiben das eine Zahl einliest und dann immer in zweierblocks zahlen vertauscht
also zB: Eingabe: 122478
Ausgabe: 214287das alles soll rekursiv und ohne schleifen passiern bitte um hilfe! soweit bin ich schon!
#include <iostream> using namespace std; int chng(int z) { if (z < 0) return 0; if (z > 10) { int hilfe = z % 100; int wert1 = hilfe / 10; int wert2 = hilfe % 10; int x = (wert2 * 10) + wert1; return x + chng(z/100); } else if (z < 10 && z > 0) { int hilfe = z % 100; int wert1 = 0; int wert2 = hilfe % 10; int x = (wert2 * 10) + wert1; return(x); } } int main() { int z; cin >> z; chng(z); cout << chng(z) << endl; }
-
Du sollst mit integern arbeiten, ja?
Dann fang am besten gar nicht so kompliziert an!
Schreib erstmal eine Funktion, die von einer gegebenen Zahl die letzten beiden Ziffern nimmt und umdreht. Das geht ja relativ leicht mit /10 und %10 und *10, so wie du das ja schon angewendet hast.Also diese Funktion macht dann:
func( 343434343 ) = 34
Wenn das soweit funktioniert, dann kannst du dem Eingabewert ja die letzten beiden Ziffern abluchsen und damit rekursiv die Funktion aufrufen und das ganze dann passend aufsummieren. Sauber geschrieben ist das dann einer Vierzeiler-Funktion, in uber-l33t code ein Einzeiler.
Viele Grüße
-
Ach ich sehe, du machst das ja schon!
int hilfe = z % 100; int wert1 = hilfe / 10; int wert2 = hilfe % 10; int x = (wert2 * 10) + wert1; return x + chng(z/100);Das ist doch schon fast alles was du benötigst, allerdings machst du da einen Fehler! chng liefert ja die untersten beiden Ziffern vertauscht zurück, aber willst du die ohne verschiebung direkt auf die letzten beiden Ziffern addieren? (Da fehlt ein *100!)
Und zu deiner Unterscheiden zwischen werten 0..10 und 0..100:
if (z < 10 && z > 0) { int hilfe = z % 100; int wert1 = 0;Was wäre denn in diesem Fall hilfe/10 ? Genau, 0, weil 0/10 immernoch 0 ist. Das heißt, die Unterscheidung kannst du dir sparen. Ich sehe, dass du die Unterscheidung als Abbruchbedingung für die Rekursion benutzt. Aber du kannst auch einfach testen, ob der Eingabewert 0 ist und dann 0 zurückgeben (und somit eine Rekursionstiefe mehr benutzen). Hier meine total unübersichtliche Lösung!
int swap_digits( int n ) { return (n==0) ? 0 : (n%10)*10 + (n/10)%10 + swap_digits(n/100)*100; }
-
danke hat geklappt

möcht jetzt noch schaun ob ich das mit meinem ansatz auch geschafft hätte!
was macht hier das ? 0 bzw der :
return (z==0) ? 0 : (z%10)*10 + (z/10)%10 + chng(z/100)*100;das hab i nu net ganz verstanden!
aber es müsste ja mit meinem ansatz ja auch funktionieren oder?
-
a ? b : c;ist sozusagen die unleserliche Variante von
if( a ) { b; } else { c; }Nur, dass man das direkt in andere Konstrukte einbauen kann.
return a ? b : c;ist darum äquivalent zu
if( a ) { return b; } else { return c; }
-
Und ja, bis auf ein paar Fehler steht in deinem Code ja dasselbe wie in meinem.
Die *100-Sache fehlt und dann solltest du dir noch überlegen, ob du den Fall von chng(0) abgedeckt hast. Der Test auf < 0 ist unnötig und schränkt die Funktion ein. Da du ja mit jedem Schritt die Zahl durch 100 teilst kommst du irgendwann ganz sicher bei 0 an. Wenn du bei 0 abbrichst und Zahlen kleiner als 0 nicht verwirfst, funktioniert der Algorithmus auch mit negativen Zahlen.
-
also der operator ? heißt soviel wie "dann" oder?
wenn a dann b und wenn nicht a dann c
oder wie kann ich das verstehn?
-
"Wenn a dann b, sonst c"
Natürlich muss a dafür irgendein Ausdruck sein, der zumindest implizit in ein bool konvertierbar ist.
int's können (implizit) in bool's konvertiert werden und die Regel lautet:false wenn integer = 0
true sonstEtwas deutlicher kann man aber z.B. schreiben:
int c = 5;
int b = (c==5) ? 1 : 0; // b = 1;Am besten ist eigentlich, wenn man dieses ?:-Konstrukt gar nicht erst einsetzt, aber so lassen sich wunderbare Einzeiler schreiben
