Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "Zeichen" im Integer (https://www.delphipraxis.net/84639-zeichen-im-integer.html)

xZise 19. Jan 2007 13:25


"Zeichen" im Integer
 
Wie kann man am schnellsten an die Länge eines Integers kommen, ohne Kommazahlen zu benutzen?

Antigo 19. Jan 2007 13:29

Re: "Zeichen" im Integer
 
meinst du wieviele Ziffern eine Integer Zahl hat?

anzziffern:=length(inttostr(zahl));

aber ist nicht so grad die feine mathematische Art ;)

Christian Seehase 19. Jan 2007 13:30

Re: "Zeichen" im Integer
 
Moin Fabian,

ein integer ist auf einem 32-Bit-System immer 4 Byte lang.

Luckie 19. Jan 2007 13:32

Re: "Zeichen" im Integer
 
Ein Interger ist immer 4 Byte lang. Oder was verstehst du unter "Länge eines Integer"? Ich befrage mal meine Glaskugel und die meint du willst die Anzahl der Ziffern einer Zahl wissen. Bitte vor dem Posten etwas nachdenken, was man eigentlich will und / oder wo konkret das Problem ist. Dann kann man auch die Frage gescheit formulieren. Meist ergibst sich dann schon von selbst die Lösung, wenn man mal etwas darüber nachgedacht hat.

3_of_8 19. Jan 2007 13:33

Re: "Zeichen" im Integer
 
Du meinst die Länge der String-Repräsentation des Integers?

Würd ich so machen:

Delphi-Quellcode:
function GetStrToIntLength(x: Integer): Integer;
begin
  if x<0 then
  begin
    Result:=1;
    x:=abs(x);
  end
    else Result:=0;
  while x>0 do
  begin
    x:=x div 10;
    inc(Result);
  end;
end;
Müsste klappen.

xZise 19. Jan 2007 13:36

Re: "Zeichen" im Integer
 
Okay... Also das meinet ich nicht @ Seehase :D
Ich meinte, wie viele Ziffern ein Integer ohne die führenden Nullen hat.

(Ich hoffe jetzt ist es verständlich :D)

z.B.
12345
wäre dann
5 als Ergebnis

@ Antigo:
So geht es, aber ist es schnell genug?

Muetze1 19. Jan 2007 13:39

Re: "Zeichen" im Integer
 
Zitat:

Zitat von xZise
@ Antigo:
So geht es, aber ist es schnell genug?

Das musst du uns sagen, ob es für deine Zwecke schnell genug ist. Vor allem hängt es von der durchschnittlichen Grösse deiner Zahlen ab, ob sich nun eine Divisionsschleife eher lohnt als eine String-Wandlung.

Vor allem: wozu brauchst du diese Information, wenn man fragen darf?

Jürgen Thomas 19. Jan 2007 13:42

Re: "Zeichen" im Integer
 
Tut mir leid, ich verstehe überhaupt nicht, was Du willst - vor allem, weil Du bei integer auf einmal von Kommazahlen sprichst. Du bist ja nicht "neu im Geschäft"; deshalb nehme ich an, Du meinst nicht:
Delphi-Quellcode:
iLaenge := SizeOf(integer);
Folgendes dürfte ziemlich langsam sein:
Delphi-Quellcode:
iLaenge := Length(IntToStr(iZahl));
Ich würde es vermutlich so machen:
Delphi-Quellcode:
function AnzahlZiffern(const iZahl: int): integer;
var i0: integer;
begin
  Result := 1;
  i0 := iZahl div 10;
  while (i0 >= 0)
  do begin
    Inc(Result);
    i0 := i0 div 10;
  end;
end;
Ich vermute, dass einer der Fachleute für ASM oder Bit-Manipulation eine schnellere Lösung kennt. Jürgen

PS. Bitte nicht sauer sein, wenn ich mit C#-Schreibweisen durcheinander gekommen bin.

PS2. Das war ja klar, dass ich langsam bin; aber meine Antwort ist noch nicht überflüssig.

Eichhoernchen 19. Jan 2007 13:42

Re: "Zeichen" im Integer
 
wie wärs mit dem 10er Logarithmus?


Delphi-Quellcode:
uses math;

{...}

function GetDigitLength(x: integer): integer;
begin
 if x <> 0 then
   result := trunc(1+Log10(abs(x)));
end;

xZise 19. Jan 2007 13:54

Re: "Zeichen" im Integer
 
Zitat:

Zitat von Jürgen Thomas
Tut mir leid, ich verstehe überhaupt nicht, was Du willst - vor allem, weil Du bei integer auf einmal von Kommazahlen sprichst.

Wo ist das Problem? Ich will die Anzahl der Ziffern ohne führenden Nullen einer Ganzzahl.
Und bei der Berechnung möchte ich auf Kommazahlen verzichten.

Zitat:

Zitat von Jürgen Thomas
Du bist ja nicht "neu im Geschäft"; deshalb nehme ich an, Du meinst nicht:
Delphi-Quellcode:
iLaenge := SizeOf(integer);

Sry, aber mit der SizeOf Methode arbeite ich eigentlich nicht.
Würde es mir die Bitgröße (= 4 Byte) wiedergeben=?

Folgendes dürfte ziemlich langsam sein:
Delphi-Quellcode:
iLaenge := Length(IntToStr(iZahl));
Zitat:

Zitat von Jürgen Thomas
Ich würde es vermutlich so machen:
Delphi-Quellcode:
function AnzahlZiffern(const iZahl: int): integer;
var i0: integer;
begin
  Result := 1;
  i0 := iZahl div 10;
  while (i0 >= 0)
  do begin
    Inc(Result);
    i0 := i0 div 10;
  end;
end;

Ist ja fast 3 of 8 Methode.

Zitat:

Zitat von Jürgen Thomas
Ich vermute, dass einer der Fachleute für ASM oder Bit-Manipulation eine schnellere Lösung kennt.

Da sich bisher niemand dazu geäußert hat... Ist es wahrschienlich eure (deine und 3 of 8) Lösung!

Zitat:

Zitat von Jürgen Thomas
PS. Bitte nicht sauer sein, wenn ich mit C#-Schreibweisen durcheinander gekommen bin.

Außer die Klammern in der "while"-Zeile sieht da nichts falsch aus... (Wobei die Klammern kein Fehler sind, aber eigentlich doch in c# Pflicht sind...)

Zitat:

Zitat von Jürgen Thomas
PS2. Das war ja klar, dass ich langsam bin; aber meine Antwort ist noch nicht überflüssig.

;)

Ich sehe schon... Ich werde das mit den Methoden versuchen... und Testen wer schnell ist und wer nicht...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 Uhr.
Seite 1 von 2  1 2      

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