Сайт о программировании, математике и моделировании
Реализация алгоритма вычитания длинных чисел
За операцию вычитания отвечает процедура Sub
/* Вычитание длинных чисел длины n цифр C=A-B.
В качестве результата возвращаем заем старшего разряда d */
DIGIT Sub(
DIGIT C[ ], /* результат */
сonst DIGIT A[ ], /* уменьшаемое */
const DIGIT B[ ], /* вычитаемое */
int n) /* длина чисел */
{
TWODIGIT T;
DIGIT d=0;
int i;
for(i=0; i<n; i++)
{ T = (TWODIGIT)A[i]-B[i]-d;
C[i] = LODIGIT(T);
d = HIDIGIT(T);
d = (0-d);
}
return d;
}
Пример на Паскале.
Procedure Sub (Var A : TLong; Const B : TLong; Const sp : Integer);
Var i, j : Integer;
{из А вычитаем В с учетом сдвига sp, результат вычитания в А}
Begin
For i := l To B[0] Do
Begin Dec(A[i+sp], B[i]);
j: = i;
{реализация сложного заимствования}
while (A[j+sp] < 0) and (j <= A[0]) Do
Begin
Inc(A[j+sp], Osn) ;
Dec(A[j+sp+l]); Inc(j);
end;
{If A[i+sp]<0 Then Begin Inc(A[i+sp], Osn);
Dec (A[i+sp+l]);End;}
End;
i := A[0];
While (i > l) And (A[i] = 0) Do Dec(i);
A[0] := i
{корректировка длины результата операции}
End;
Print article | This entry was posted by root on 03.12.2010 at 8:15 пп, and is filed under Задачи и решения. Follow any responses to this post through RSS 2.0. Вы можете оставить комментарий или трэкбэк с вашего сайта. |