Thema: HugeInt_Div

Einzelnen Beitrag anzeigen

gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

AW: HugeInt_Div

  Alt 11. Jan 2012, 08:53
Deine neuen Routinen haben noch einen schweren Fehler, denn sie arbeiten nur richtig für positive Integer, zB ergibt 16 div (-3) den Wert 251! Außerdem kann man sie noch drastisch vereinfachen (wenn Du nicht gleich ein kombiniertes div-mod berechnen willst), zB
Delphi-Quellcode:
function HugeIntDivCard(A: HugeInt; B: cardinal): HugeInt;
var
  I: integer;
  R: cardinal;
begin
  R:= 0;
  FillChar(Result, SizeOf(HugeInt), 0);
  I:= HugeIntSize-1;
  while (I > 0) and (A[I] = 0) do Dec(I);
  while I >= 0 do begin
    R:= 256*R + A[I];
    Result[I]:= R div B;
    R:= R mod B;
    Dec(I);
  end;
end;

function HugeIntModCard(A: HugeInt; B: cardinal): cardinal;
var
  I: integer;
begin
  Result:= 0;
  I:= HugeIntSize-1;
  while (I > 0) and (A[I] = 0) do Dec(I);
  while I >= 0 do begin
    Result:= (256*Result + A[I]) mod B;
    Dec(I);
  end;
end;
Falls Du wirklich Integer brauchst, müssen neben dem Aufruf der ...Card-Routinen noch die Vorzeichen betrachtet werden. Weiterhin darf B nicht zu groß sein (kleiner 2^24), sonst gibt es einen Overflow und man muß in den Schleifen mit Int64 rechnen.
  Mit Zitat antworten Zitat