Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Битовая логика.docx
Скачиваний:
2
Добавлен:
11.07.2019
Размер:
122.24 Кб
Скачать

Сравнение двух целых чисел, представленных в виде строки

Пусть у нас стоит задача сравнения двух целых чисел, представленных в виде строки. Например, надо сравнить «123» и «12».

Но с точки зрения математики запись «12» и «012» абсолютно эквивалентны. В алгоритмах сложения, умножения «передние» нули нам не мешали, но в этом случае их необходимо удалить. Поэтому перед сравнением у обоих чисел необходимо удалить передние нули.

Теперь, если одно из чисел имеет большую длину, то оно является максимальным.

Если числа имеют одинаковую длину, то их надо сравнивать начиная с начала до конца. Как только встретятся разные цифры, мы сможем сказать результат сравнения. Если мы дойдем до конца чисел и не встретим разные цифры, то эти числа равны.

В программировании часто встречаются функции сравнения и , которая возвращает . Будем придерживаться аналогичных правил.

Полная реализация алгоритма приведена ниже:

Реализация алгоритма на Pascal

function compare(s1, s2 : string) : shortint;

function prepare(s : string) : string;

var

res : string;

begin

res := s;

{$B-}

while (length(res) > 0) and (res[1] = '0') do

delete(res, 1, 1);

prepare := res;

end;

var

i : integer;

begin

s1 := prepare(s1);

s2 := prepare(s2);

if (length(s1) > length(s2)) then

begin

compare := 1;

exit;

end;

if (length(s1) < length(s2)) then

begin

compare := -1;

exit;

end;

for i := 1 to length(s2) do

begin

if (s1[i] = s2[i]) then

continue;

if (s1[i] > s2[i]) then

compare := 1

else

compare := -1;

exit;

end;

compare := 0;

end;

Вычитание целых чисел, представленных в виде строки

Пусть у нас стоит задача вычитания двух целых чисел, представленных в виде строки. Например, надо найти разность «123» и «12».

Очевидно, что вычитание – операция, обратная операции сложения. Из этого вытекает, что в любом случае необходимо будет дополнить меньше по длинне число нулями спереди. Т.е. в данном случае мы будем искать разность не «123» и «12», а «123» и «012».

Из-за того, что вычитание – обратная операция сложению, работа с флагом переноса превратиться в работу с флагом заема. Т.е. если он установлен, то из разряда вычитается, а не прибавляется единица.

Однако возникает ситуация, когда разность получается отрицательная.

Но эта ситуация очень просто решается, если воспользоваться аналогией с дополнительным кодом. В этом случае абсолютная величина разности будет 10k-dif, где dif – разность чисел, k – число разрядов в разности чисел после удаления стартовых нулей.

Реализация алгоритма на Pascal

function strSub(s1, s2 : string) : string;

var

res : string;

i : integer;

flag : boolean;

n1, n2 : shortint;

r : shortint;

tempStr : string;

begin

while (length(s1) < length(s2)) do

s1 := '0' + s1;

while (length(s2) < length(s1)) do

s2 := '0' + s2;

res := '';

flag := false;

for i := length(s1) downto 1 do

begin

n1 := ord(s1[i]) - ord('0');

n2 := ord(s2[i]) - ord('0');

if (flag) then

n1 := n1 - 1;

r := n1 - n2;

flag := (r < 0);

if (flag) then

r := r + 10;

res := chr(r + ord('0')) + res;

end;

{$B-}

while (length(res) > 1) and (res[1] = '0') do

delete(res, 1, 1);

if (flag) then

begin

tempStr := '';

while (length(tempStr) < length(res)) do

tempStr := tempStr + '0';

tempStr := '1' + tempStr;

res := strSub(tempStr, res);

res := '-' + res;

end;

strSub := res;

end;