[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]