Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zahlen zerlegen (https://www.delphipraxis.net/177030-zahlen-zerlegen.html)

jensw_2000 10. Okt 2013 22:50

Zahlen zerlegen
 
Kann man unsigned Integer im Bereich von 0-999 effektiver (also mit weniger Code, Performance nicht sehr relevant) in Einer, Zehner und Hunderter zerlegen?

-----------
PS: optimierte Version
-----------

Delphi-Quellcode:

interface

type
  TZahlSplitter = class(TObject)
  public
    class function getEiner(aZahl: UInt): UInt;
    class function getZehner(aZahl: UInt): UInt;
    class function getHunderter(aZahl: UInt): UInt;
  end;

implementation

{ TZahlSplitter }

class function TZahlSplitter.getEiner(aZahl: UInt): UInt;
begin
  Result := aZahl mod 10;
end;

class function TZahlSplitter.getZehner(aZahl: UInt): UInt;
begin
  Result := (Zahl div 10) mod 10;
end;

class function TZahlSplitter.getHunderter(aZahl: UInt): UInt;
begin
  Result := (Zahl div 100) mod 10;
end;

jfheins 10. Okt 2013 22:54

AW: Zahlen zerlegen
 
Ja. Abgesehen davon, dass ein Uint8 nicht bis 999 reicht:

Delphi-Quellcode:
Einer := Zahl mod 10;
Zehner := (Zahl div 10) mod 10;
Hunderter := (Zahl div 100) mod 10;

arnof 10. Okt 2013 22:57

AW: Zahlen zerlegen
 
Ich würde das über die Länge machen:

Mit Trunk die ganzzahlermittel in String wandeln dann haste je stelle Milliarden,Millionen bis einer

jensw_2000 10. Okt 2013 23:14

AW: Zahlen zerlegen
 
Zitat:

Zitat von jfheins (Beitrag 1231715)
Ja. Abgesehen davon, dass ein Uint8 nicht bis 999 reicht:

auch gerade festgestellt..:)
Habe den Code oben umgebaut.
Kürzer geht's vermutlich wirklich nicht und die String Konvertierungen sind auch überflüssig.

himitsu 10. Okt 2013 23:20

AW: Zahlen zerlegen
 
Notfalls schaltest du einfach mal die Bereichs-/Indexprüfungen in deinen Projektoptionen an, damit du sowas wie mit der 999 selber mitbekommst.

Aphton 10. Okt 2013 23:52

AW: Zahlen zerlegen
 
Delphi-Quellcode:
function getNthDigit(Number: UInt; N: Byte): Integer;
begin
  if N > 10 then // "4294967296" ist 2^31 (größte Zahl) und hat 10 Stellen
    Result := -1 // Fehler
  else
  begin
    while N > 1 do
    begin
      Number := Number div 10;
      dec(N);
    end;
    Result := Number mod 10;
  end;
end;
Nicht getestet, ingame geschrieben!

Medium 11. Okt 2013 00:16

AW: Zahlen zerlegen
 
Dann aber so:
Delphi-Quellcode:
type
  TDigitPosition = 1..10; // Da sollte die Bereichsprüfung zuschlagen
  TDecimalDigit = 0..9; // Einfach ums abzurunden :D

function getNthDigit(Number: UInt; N: TDigitPosition): TDecimalDigit;
begin
  Result := (Number div Integer(Power(10, N-1))) mod 10; // Cast ggf. nicht nötig, weiss gerade nicht ob's ne Int-Überladung gibt
end;
:)

jensw_2000 11. Okt 2013 00:27

AW: Zahlen zerlegen
 
Quält euch nicht länger.
3stellig reicht in diesem kleinen Experiment völlig aus und ich habe gelernt, das der Modulus zu mehr zu gebrauchen ist, als zum Realisieren von Seitennummerierungen :)


Danke.

Aphton 11. Okt 2013 02:24

AW: Zahlen zerlegen
 
Zitat:

Zitat von Medium (Beitrag 1231728)
Dann aber so:
Delphi-Quellcode:
type
  TDigitPosition = 1..10; // Da sollte die Bereichsprüfung zuschlagen
  TDecimalDigit = 0..9; // Einfach ums abzurunden :D

function getNthDigit(Number: UInt; N: TDigitPosition): TDecimalDigit;
begin
  Result := (Number div Integer(Power(10, N-1))) mod 10; // Cast ggf. nicht nötig, weiss gerade nicht ob's ne Int-Überladung gibt
end;
:)

Nein, also ja, so gehts zwar auch, aber dafür brauchste "Power".. Für meine Variante brauchste nichts - daher ist sie auch anfängerfreundlicher (hab ingame kB gehabt, der Person zu erklären, dass Math noch eingebunden werden muss usw..)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz