Zahlen zusammenfügen NICHT addieren

Guest1

Aktives Mitglied
Hallo zusammen,
Ist es möglich zwei int werte zusammenzufügen?

z.B. 1 und 2 soll 12 ergeben und nicht 3 ?
(Statische Methode)
Public static long verkette(long zahl1, long zahl2){
return zahl1 < zahl2
? (zahl1 * 10) + zahl2
: (wie rechne ich weiter wenn die zahlen größer werden?)
}
 

httpdigest

Top Contributor
Java:
public static long verkette(long zahl1, long zahl2) {
  return zahl1 * (long) Math.pow(10, Math.floor(zahl2 == 0 ? 1 : Math.log10(zahl2) + 1)) + zahl2;
}

oder einfach:
Java:
public static long verkette(long zahl1, long zahl2) {
  return Long.valueOf("" + zahl1 + zahl2);
}
 

Guest1

Aktives Mitglied
@httpdigest danke:)
Leider sind wir noch nicht so weit.
Als beispiel kann ich dir einen code Beispiel zeigen.

//wenn die Ziffer in der dezimaldarstellung der Zahl vorkommt, dann wird true geliefert.

z.B. public static boolean enthaelt(long zahl, int ziffer){
return zahl < ziffer
? zahl == ziffer
: zahl % 10 == ziffer;

System.out.println(enthaelt(5511, 1));
Hier wird true geliefert.
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
Noch etwas: Dein geposteter Code für enthaelt() kompiliert nicht, da in Java eine 1 nicht nach true gewandelt werden kann. Bist du sicher, dass das Java-Code sein soll?
Wenn wir statt der 1 ein 'true' schreiben, dann funktioniert die Methode auch nicht immer. Z.B. für enthaelt(30, 3) kommt false raus.
Der Code testet immer nur die niedrigstwertigste Stelle (die "Einer"-Stelle) der Zahl.
 

Guest1

Aktives Mitglied
Noch etwas: Dein geposteter Code für enthaelt() kompiliert nicht, da in Java eine 1 nicht nach true gewandelt werden kann. Bist du sicher, dass das Java-Code sein soll?
Wenn wir statt der 1 ein 'true' schreiben, dann funktioniert die Methode auch nicht immer. Z.B. für enthaelt(30, 3) kommt false raus.
Der Code testet immer nur die niedrigstwertigste Stelle (die "Einer"-Stelle) der Zahl.

Oh das stimmt, aber jetzt sollte es richtig sein.
 

Guest1

Aktives Mitglied
Falls du mit "jetzt" die editierte Version deines Postes meinst, dann: Nein. Immer noch falsch. enthaelt(30, 3) ist immer noch false.

public static boolean enthaelt(long zahl, int ziffer) {
return (zahl < 10)
? (zahl == ziffer)
: ((zahl % 10) == ziffer)
?true
: enthaelt(zahl / 10, ziffer)); }
So vielleicht?

Übrigens die andere Aufgabe konnte ich immer noch nicht lösen, ich brauche so eine schreibweise ohne schleifen etc...
 

httpdigest

Top Contributor
Ja, das klappt. Kannst das Ganze noch ein klein wenig vereinfachen:
Java:
public static boolean enthaelt(long zahl, int ziffer) {
  return zahl < 10 ? zahl == ziffer : zahl % 10 == ziffer || enthaelt(zahl / 10, ziffer);
}
 

httpdigest

Top Contributor
Du sollst also die verkette() Methode mit rein arithmetischen Operatoren (/, %, *, ...) mit Rekursion und ohne Schleifen und String-Operationen umsetzen. Richtig?
In dem Falle musst du nur erstmal wieder überlegen, was deine Abbruchbedingung der Rekursion ist und welche der beiden Zahlen du pro Rekursionsschritt "verkleinern" möchtest, um zur Abbruchbedingung zu kommen.
Hinweis: Es ist auch möglich, mit diesen Nebenbedingungen die verkette() Methode in einer Zeile mit einem return-Statement zu lösen.
 

Guest1

Aktives Mitglied
Du sollst also die verkette() Methode mit rein arithmetischen Operatoren (/, %, *, ...) mit Rekursion und ohne Schleifen und String-Operationen umsetzen. Richtig?
In dem Falle musst du nur erstmal wieder überlegen, was deine Abbruchbedingung der Rekursion ist und welche der beiden Zahlen du pro Rekursionsschritt "verkleinern" möchtest, um zur Abbruchbedingung zu kommen.
Hinweis: Es ist auch möglich, mit diesen Nebenbedingungen die verkette() Methode in einer Zeile mit einem return-Statement zu lösen.
Genau, werde ich versuchen
Danke für deine Hilfe:)
 

httpdigest

Top Contributor
Und was ist mit (234, 10) oder (1, 569)? Das geht ja schon gar nicht mehr. Du hast nur für die von dir als Beispiel genannten Zahlen gerade so einen nicht allgemeinen Weg gefunden, damit es mit genau den exakten Beispielen funktioniert. Das ist aber nicht der richtige Weg.
 

httpdigest

Top Contributor
Um zum richtigen rekursiven Algorithmus zu kommen, hier mal der Gedankengang mit einem Beispiel:
Angenommen, wir wollen die zwei Zahlen 12345 und 678 konkatenieren. Wir haben keinen Weg, herauszufinden, wie lang jede Zahl jeweils exakt ist. Wir können aber die Zahlen vergleichen. Z.B. könnten wir vergleichen, ob die zweite Zahl < 10 ist, in welchem Fall wir die erste Zahl nur noch mit 10 multiplizieren müssen und die zweite Zahl addieren, um das Ergebnis zu bekommen. Das ist unsere rekursive Abbruchbedingung. Falls die zweite Zahl nun größer als 10 ist, brauchen wir einen rekursiven Abstieg, der die zweite Zahl kleiner macht und das Gesamtergebnis entsprechend skaliert (multipliziert). So, jetzt aber genug erklärt. :)
 

Neue Themen


Oben