Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.30;
Скачать: CL | DM;

Вниз

Длинные числа   Найти похожие ветки 

 
mike.dld ©   (2003-12-17 15:59) [0]

Помогите, пожалуйста, разобраться в процедуре Divide, по какоду принципу она работает (какой алгоритм использует)


const
MAXDIG = 250
BASE = 10000

type
TLongNumber = array [0..MAXDIG] of SmallInt;

function ShiftCompare(A,B: TLongNumber; Shift: SmallInt): Byte;
var
i: SmallInt;
begin
if A[0] > (B[0]+Shift) then
Result := 0
else
if A[0] < (B[0]+Shift) then
Result := 1
else
begin
i := A[0];
while (i > Shift) and (A[i] = B[i-Shift]) do
dec(i);
if i = Shift then
begin
Result := 0;
for i := 1 to Shift do
if A[i] > 0 then
Exit;
Result := 2;
end
else
Result := Byte(A[i]<B[i-Shift]) ;
end;
end;

function BinSearch(var A: TLongNumber; B: TLongNumber; Shift: SmallInt): SmallInt;
var
Down,Up: Word;
C: TLongNumber;
begin
Down := 0;
Up := BASE;
while Up-1 > Down do
begin
C := ShortMult(B,(Up+Down) div 2);
case ShiftCompare(A,C,Shift) of
0: Down := (Down+Up) div 2;
1: Up := (Up+Down) div 2;
2: begin
Up := (Up+Down) div 2;
Down := Up;
end;
end;
end;
C := ShortMult(B,(Up+Down) div 2);
if Compare(A,C) = 0 then
A := ShiftSub(A,C,Shift)
else
A := ShiftSub(C,A,Shift);
Result := (Up+Down) div 2;
end;

function Divide(A,B: TLongNumber; var Rem: TLongNumber): TLongNumber;
var
Shift: SmallInt;
begin
Rem := A;
Shift := A[0] - B[0];
if ShiftCompare(A,B,Shift) = 1 then
dec(Shift);
Result[0] := Shift + 1;
while Shift >= 0 do
begin
Result[Shift+1] := BinSearch(Rem,B,Shift);
dec(Shift);
end;
end;


 
Amoeba ©   (2003-12-17 16:10) [1]

А собственная голова на плечах для чего? Шапку носить?


 
MBo ©   (2003-12-17 16:47) [2]

Метод деления уголком, только очередная "10000-ричная цифра" результата ищется не прикидкой или перебором, а двоичным поиском



Страницы: 1 вся ветка

Текущий архив: 2003.12.30;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
14-99783
RainKM
2003-12-09 14:57
2003.12.30
com


1-99556
Builder
2003-12-17 16:58
2003.12.30
Word


14-99735
Agrippina
2003-12-04 18:26
2003.12.30
Причины и следствия


1-99536
Rawman
2003-12-16 12:25
2003.12.30
Изменение стандартных компонент


3-99445
Dimm_001
2003-12-06 03:04
2003.12.30
русские буквы