Contributor: EUGENE VENTIMIGLIA 
{
 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 n0 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 Carry0 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.
 

AltStyle によって変換されたページ (->オリジナル) /