>

Шоста задача. Віднімання двох довгих чисел з врахуванням зсуву.

Введемо обмеження: число, від якого віднімають, більше, ніж число, яке віднімається. Працювати з "довгими від’ємними числами" ми не вміємо.

Процедура б була схожа на процедури додавання і множення, якби не позичання одиниці із старшого розряду замість перенесення одиниці в старший розряд. Наприклад, в звичайній системі числення ми віднімаємо 9 від 11 – йде позичання 1 з розряду десятків, а якщо з 10000 віднімаємо 9 – процес позичання дещо складніший.

Procedure Sub (Var А: TLong; Const B: TLong; Const sp: Integer);

Var i,j: Integer;

{з А віднімаємо В з урахуванням зсуву sp, результат віднімання в А}

Begin

For i:=l To B[0] Do

Begin

Dec(А[i+sp], B[i]);

j:=i;   {реалізація складного позичання}

while (А[j+sp]<0) and (j<=A[0]) Do

Begin

Inc(А[j+sp], Osn);

Dec(А[j+sp+l]);   Inc(j);

end;

end;

i:=A[0];

While (i>l) And (A[i]=0) Do Dec(i);

A[0]:=i;     {коригування довжини результату операції}

End;

Hosted by uCoz