Ver Mensaje Individual
  #4  
Antiguo 30-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
Estuve jugando un poco con esto de los números GRANDES, y he llegado hasta aquí. En ningún caso los algoritmos están optimizados, pero si no los quieres para nada muy serio te pueden servir.

Código Delphi [-]
type
  TSuperLargo = array[0..15] of Byte;

function AddSuper(var a,b: TSuperLargo; Acarreo: Integer): TSuperLargo; overload;
var
  i,j: integer;
begin
  for i := 0 to 15 do
  begin
    j:= (Integer(a[i]) + Integer(b[i])) + Acarreo;
    Result[i]:= j mod 256;
    Acarreo:= j div 256;
  end;
end;

function AddSuper(a,b: TSuperLargo): TSuperLargo; overload;
begin
  Result:= AddSuper(a,b,0);
end;

function SubSuper(a,b: TSuperLargo): TSuperLargo;
var
  i: integer;
begin
  for i := 0 to 15 do
    b[i]:= b[i] xor $FF;
  Result:= AddSuper(a,b,1);
end;

function MulSuper(a: TSuperLargo; b: Byte): TSuperLargo; overload;
var
  i,j: integer;
  Acarreo: Integer;
begin
  Acarreo:= 0;
  for i := 0 to 15 do
  begin
    j:= (Integer(a[i]) * Integer(b)) + Acarreo;
    Result[i]:= j mod 256;
    Acarreo:= j div 256;
  end;
end;

function ShiftLSuper(a: TSuperLargo): TSuperLargo;
var
  i: integer;
begin
  Result[0]:= 0;
  for i:= 0 to 14 do
    Result[i+1]:= a[i];
end;

function ShiftRSuper(a: TSuperLargo): TSuperLargo;
var
  i: integer;
begin
  Result[15]:= 0;
  for i:= 1 to 15 do
    Result[i-1]:= a[i];
end;

function MulSuper(a,b: TSuperLargo): TSuperLargo; overload;
var
  i: integer;
begin
  FillChar(Result,Sizeof(Result),0);
  for i:= 15 downto 0 do
  begin
    Result:= ShiftLSuper(Result);
    Result:= AddSuper(Result,MulSuper(a,b[i]));
  end;     
end;

function int64ToSuper(a,b: int64): TSuperLargo;
var
  i: integer;
begin
  for i:= 0 to 7 do
  begin
    Result[i]:= Byte((a shr (8*i)) and $FF);
    Result[i+8]:= Byte((b shr (8*i)) and $FF);
  end;
end;

procedure SuperToInt64(S: TSuperLargo; var a: int64; var b: int64);
var
  i: integer;
begin
  for i:= 7 downto 0 do
  begin
    a:= (a shl 8) + S[i];
    b:= (b shl 8) + S[i+8];
  end;
end;

Con esto puedes hacer operaciones simples: suma, resta, multiplicación, desplazamientos, la división se me antojaba muy complicada

Código Delphi [-]
// Ejemplo
var
  a,b: TSuperLargo;
  x,y: int64;
begin
  a:= int64ToSuper(1000,0);
  b:= int64ToSuper($2222,$5533);
  b:= AddSuper(a,b);
  SuperToInt64(b,x,y);
end;

En fin, si quieres realizar algo un poco serio, encontraras librerías en Internet para manejar números grandes, pero para algo sencillo esto te puede servir.
Responder Con Cita