За операцию вычитания отвечает процедура 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; | |
Просмотров: 413 | Добавлено: 10.03.2015, 04:16 |