[Back to MATH SWAG index]  [Back to Main SWAG index]  [Original]

{
 I wrote routines to add and multiply any amount of bytes one at a time,
 but then had no way to test them out:)
}
program Really_Big_Math;

type ReallyBigNumber = array[0..100] of byte;
    {Byte [0] is the length, [1] is least significant}

procedure ShiftRBN(var A:ReallyBigNumber;N:byte);
var Index:Byte;
begin
  if n<>0 then begin
    for Index :=(A[0] + N) downto N+1 do A[Index] := A[Index - N];
    for Index := 1 to N do A[Index] := 0;
    Inc(A[0],N);
  end;
end;

procedure ByteAdd(A,B:Byte; var C,S:byte);
var temp:word;
begin
  temp := A+B+C;
  C    := temp div 256;
  S    := temp mod 256;
end;

Procedure ByteMult(A,B:Byte;var C,P:byte);
var temp:word;
begin
  temp:=A*B+C;
  C:=temp div 256;
  P:=temp mod 256;
end;


Procedure Sum(N1,N2:ReallyBigNumber;var S:ReallyBigNumber);
var WorkArray : ReallyBigNumber;
    L,Index,
    Carry     : byte;

begin
  Carry := 0;WorkArray[0] := 0;
  if N1[0] = 0 then for Index := 1 to 100 do N1[Index] := 0;
  if N2[0] = 0 then for Index := 1 to 100 do N2[Index] := 0;
  if N1[0] > N2[0] then L := N1[0] else L := N2[0];
  for Index := 1 to L do begin
   ByteAdd(N1[Index],N2[Index],Carry,WorkArray[Index]);
   inc(WorkArray[0]);
  end;
  if Carry <> 0 then inc(WorkArray[0]);
  WorkArray[L+1]:= Carry;
  S := WorkArray;
end;

procedure Product(N1,N2:ReallyBigNumber;var PR:ReallyBigNumber);
var C1,C2,L1,L2,
    Carry        :Byte;
    TProduct,
    WorkRBN      :ReallyBigNumber;
begin
  WorkRBN[0] := 0;
  L1 := N1[0];L2 := N2[0];
  for C1 := 1 to L1 do begin
    Carry:=0;TProduct[0]:=0;
    for C2 := 1 to L2 do begin
      ByteMult(N1[C1],N2[C2],Carry,TProduct[C2]);
      inc(TProduct[0]);
    end;
    if Carry<>0 then begin
      TProduct[C2+1] := Carry;
      inc(TProduct[0]);
    end;
    ShiftRBN(TProduct,C1-1);
    Sum(TProduct,WorkRBN,WorkRBN)
  end;
  PR := WorkRBN;
end;

procedure STR2RBN(S:String; var R:ReallyBigNumber);

var Index,
    SLen      : Byte;
    Value,
    RBNTen,
    RBNPlus   : ReallyBigNumber;

 function Ch2Val(C:Char):Byte;
 begin
   Ch2Val := ord(C) - 48;
 end;

begin
  SLen := Length(S);
  RBNTen[0] := 1; RBNTen[1] := 10;      {To Multiply Value by Ten}
  RBNPlus[0] := 1; RBNPlus[1] := 0;     {To add to Value}
  Value[0] := 1; Value[1] := Ch2Val(S[1]);
  if SLen > 1 then
    for Index := 2 to SLen do begin     (***THANKS DJ!!***)
      RBNPlus[1] := Ch2Val(S[Index]);
      Product(RBNTen,Value,Value);
      Sum(RBNPlus,Value,Value);
    end;
  R := Value;
end;

procedure RBN2Real(RBN:ReallyBigNumber;var RR:Real);
var RValue:Real;
begin
  RValue:=0;
  repeat
    RValue := RValue * 256;
    RValue := RValue + RBN[RBN[0]];
    dec(RBN[0]);
  until RBN[0] < 1;
  RR := RValue;
end;

var AA,BB,SS,PP: ReallyBigNumber;
    StA,StB    : String;
    RealP,RealS    : Real;

begin
  Writeln('Input A');
  Readln(StA);
  Writeln('Input B');
  Readln(StB);
  STR2RBN(StA,AA);
  STR2RBN(StB,BB);
  Sum(AA,BB,SS);
  Product(AA,BB,PP);
  RBN2Real(SS,RealS);
  RBN2Real(PP,RealP);
  Writeln('Sum =',RealS);
  Writeln('Product =',RealP);
end.

[Back to MATH SWAG index]  [Back to Main SWAG index]  [Original]