C# Ziffer an Int anfügen

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hi,
ich möchte per Button Klick eine Ziffer an eine vorhandene Zahl anfügen.
Z.B. soll immer die 3 angefügt werden: 3 -> 33 -> 333...
Eigentlich wie bei einem String. Das ganze soll aber ohne Typumwandlung gehen.

Ich dachte an die Bit-Operatoren "<<". Nur steh ich auf dem Schlauch, da
dort mit Dualzahlen gerechnet wird: 1 -> 10 -> 100 -> 1000 aber eben mit der Basis 2.

Hat jemand von euch einen Tipp? Google hat leider bisher nicht geholfen.
Danke schon mal!
 
Na was ist das mathematisch? Eine Multiplikation gefolgt von einer Addition. Nur die Operanden musst du noch selbst herausfinden.
 
  • Gefällt mir
Reaktionen: Jurial, KitKat::new(), Raijin und 4 andere
currentValue = currentValue * 10 + nextValue, oder verstehe ich das Problem falsch?

Damit Rutscht die derzeitige Zahl eine Zehnerpotenz nach oben und die nächste Zahl wird ans Ende angehängt.
Oder willst du die nächste Zahl an den Anfang der derzeitigen Zahl hängen?

Das funktioniert natürlich auch nur bei 0-9 wenn du zweistellige Zahlen anhängen willst wirds interessanter...
Und was natürlich überhaupt nicht funktionieren kann, ist wenn die erste Zahl eine 0 ist...

Lass mich raten, dass ist ne Aufgabe aus der Schule oder fürs Studium... Völlig am realen Leben vorbei.
Hauptsache ein triviales Problem mit sinnloser Mathematik verkomplizieren. Sorry offtopic ^^
 
palaber schrieb:
Ich dachte an die Bit-Operatoren "<<". Nur steh ich auf dem Schlauch, da
Bit-Operator, du schreibst es ja selbst. Bits sind Binär. D.h. sie haben rein gar nichts mit dem dezimalen Zahlensystem zu tun.

3 << 1 wird also nicht 30, sondern 6, weil aus 011 binär eben 110 wird.

Analog dazu wird bei 3 >> 1 aus 011 konsequenterweise 001, also dez 1.

Das Bitschieben ist also immer eine Multiplikation/Division um Faktor 2. << 2 ist also effektiv x4
 
Dann so wie @T2xlc vorgeschlagen hat.

Code:
var startNumber = 3;
var iterate = startNumber;

for (int i = 0; i < 5; i++)
{
    iterate = iterate * 10 + startNumber;
}
 
Erstmal danke für die ganzen Antworten!

Raijin schrieb:
Das Bitschieben ist also immer eine Multiplikation/Division um Faktor 2. << 2 ist also effektiv x4
Okay, dann stand ich doch nicht auf dem Schlauch, sondern lag mit meinen Gedanken da ja schon mal richtig.

ZeroStrat schrieb:
Dann so wie @T2xlc vorgeschlagen hat.

Code:
var startNumber = 3;
var iterate = startNumber;

for (int i = 0; i < 5; i++)
{
    iterate = iterate * 10 + startNumber;
}
So ähnlich hatte ich es auch schon im Kopf.

T2xlc schrieb:
Lass mich raten, dass ist ne Aufgabe aus der Schule oder fürs Studium... Völlig am realen Leben vorbei.
Hauptsache ein triviales Problem mit sinnloser Mathematik verkomplizieren. Sorry offtopic ^^
Haha, gut geraten, aber knapp vorbei ;) - ich taste mich gerade an Entwurfsmuster heran. Und bei einem von mir erdachten Bsp.-Programm kam diese Frage auf. Möchte meine Programmier-Skills etwas verbessern und dazu gehört halt auch effizienter Code. Aber in diesem Fall greife ich doch gerne auf die Typumwandlung zurück.
Lesbarer und leicht verständlicher Code sind ja auch prima. Und hierbei wird man keine Laufzeitprobleme bekommen ;)
 
palaber schrieb:
Aber in diesem Fall greife ich doch gerne auf die Typumwandlung zurück.
Wieso Typumwandlung? Du schreibst, dass du an eine Zahl eine Ziffer anhängen willst. Ausgehend von einer Dezimalzahl diese mit 10 multiplizieren und deinen Offset addieren, fertig. Keine Umwandlung, kein gar nichts. Ich verstehe das Problem irgendwie nicht...
 
Wenn du das auch noch in eine Methode/Funktion packst decimal AttachDigitToEnd(decimal target, byte digit)* dann brauchst du die Logik nicht einmal sofort verstehen (falls die Mathematik nicht verständlich wäre). Aus dem Namen wäre ja ersichtlich, was möglich ist.

*Man kann jetzt darüber streiten, ob man ulong oder decimal nimmt. ulong hat bis zu 20 Ziffern und decimal bis zu 29 Ziffern.
 
Der Vollständigkeit halber hier eine Varainte für zwei beliebige Zahlen:
Code:
    static ulong ConcatInt(uint lead, uint follow)
    {
      var uint magnitude;
      
      if (follow = 0)
      {
        magnitude = 10;
      }
      else
      {
        magnitude = Math.Pow(10, Math.Floor(Math.Log10(follow)) + 1);
      }

      return magnitude * lead + follow;   
    }

Erklärung:
Math.Floor(Math.Log10(follow)) liefert dir den Exponenten der Größenordnung einer beliebigen Zahl (0, 1, 2, 3, 4, 5, ...).
Math.Pow(10, Math.Floor(Math.Log10(follow))) liefert dir entsprechend die eigentliche Größenordnung (1, 10, 100, 1000, 10000, 100000, ...).
D.h. für 1 <= follow <= 9 liefert die Rechung 0,
für 10 <= follow <= 99 liefert die Rechung 10,
für 10000 <= follow <= 99999 liefert die Rechung 10000,
für 1000000 <= follow <= 9999999 liefert die Rechung 1000000,
usw.
Das reicht jetzt noch nicht, deswegen muss der Exponent um 1 erhöht werden (entspricht einer Multiplikation der Größenordnung um 10), wie es auch oben im Code der Fall ist: Math.Pow(10, Math.Floor(Math.Log10(follow)) + 1)

Für das Endergebnis wird dann einfach die Größenordnung magnitude mit der führenden Zahl lead und damit die anzuhängende Zahl follow addiert.
Da magnitude 10 Mal größer ist, als follow, hat magnitude * lead am Ende genau so viele zusätzliche Nullen, wie die Größenordnung von follow.
follow passt damit dann immer genau hinter lead, ohne die einzelnen Ziffern der beiden Zahlen lead und follow zu verändern.

Anmerkung:
Da der 10er-Logarithmus für 0 nicht definiert ist, muss dieser Fall explizit behandelt werden.
 
Zurück
Oben