# Zahlen zusammenfügen NICHT addieren



## Guest1 (29. Nov 2018)

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 (29. Nov 2018)

```
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:

```
public static long verkette(long zahl1, long zahl2) {
  return Long.valueOf("" + zahl1 + zahl2);
}
```


----------



## max40 (29. Nov 2018)

so wie der 2. Vorschlag von httpdigest.


----------



## Guest1 (29. Nov 2018)

@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.


----------



## httpdigest (29. Nov 2018)

Guest1 hat gesagt.:


> Leider sind wir noch nicht so weit.


Soweit, wofür?


Guest1 hat gesagt.:


> Als beispiel kann ich dir einen code Beispiel zeigen. ...snip...


Und was hat das jetzt mit deiner ursprünglichen Aufgabe/Frage zu tun?


----------



## Guest1 (29. Nov 2018)

Math.pow... kenne ich nocht nicht.


----------



## httpdigest (29. Nov 2018)

Guest1 hat gesagt.:


> Math.pow... kenne ich nocht nicht.


Dann nimm halt die zweite Lösung mit Stringkonkatenation und Parsen des Strings wieder zurück als long. 

Alternativ kannst du auch eine Schleife nehmen, statt pow und log10.


----------



## Guest1 (29. Nov 2018)

@httpdigest okay, danke


----------



## httpdigest (29. Nov 2018)

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 (29. Nov 2018)

httpdigest hat gesagt.:


> 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.


----------



## httpdigest (29. Nov 2018)

Guest1 hat gesagt.:


> Oh das stimmt, aber jetzt sollte es richtig sein.


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


----------



## Guest1 (29. Nov 2018)

httpdigest hat gesagt.:


> 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 (29. Nov 2018)

Ja, das klappt. Kannst das Ganze noch ein klein wenig vereinfachen:

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


----------



## httpdigest (29. Nov 2018)

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 (29. Nov 2018)

httpdigest hat gesagt.:


> 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 (29. Nov 2018)

Weiterer kleiner Hinweis: Als "Zutaten" brauchst hierzu die folgenden Operatoren:
1x '<'
2x '*'
1x '%'
2x '+'
1x '/'
1x '?:'


----------



## Guest1 (29. Nov 2018)

httpdigest hat gesagt.:


> Weiterer kleiner Hinweis: Als "Zutaten" brauchst hierzu die folgenden Operatoren:
> 1x '<'
> 2x '*'
> 1x '%'
> ...



Ich habe so eine lösung gefunden:
return zahl1 < zahl2
            ?(zahl1 * 10000) + zahl2
           : zahl1* 10) + zahl2;

Mir fällt gar nichts ein


----------



## httpdigest (29. Nov 2018)

Guest1 hat gesagt.:


> Ich habe so eine lösung gefunden: ...snip...


Na, das ist ja offensichtlich falsch. Wieso denn * 10000? Und wo ist die notwendige Rekursion?


----------



## Guest1 (29. Nov 2018)

httpdigest hat gesagt.:


> Na, das ist ja offensichtlich falsch. Wieso denn * 10000? Und wo ist die notwendige Rekursion?


Weil ich solche zahlen miteinander verketten soll
(6899,1)
(234,0)
(0,569)


----------



## httpdigest (29. Nov 2018)

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 (29. Nov 2018)

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.


----------

