- •Оглавление
- •Представление чисел в памяти эвм
- •Представление беззнаковых целых чисел в памяти эвм
- •Обратный код
- •Пример 1.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Важное следствие (пример 2).
- •Представление вещественных типов в памяти эвм
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 3
- •Пример 4
- •Алгоритмы работы с числами, которые представлены строкой
- •Сложение положительных чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Умножение положительного числа, представленного в виде строки, на одноразрядный коэффициент
- •Реализация алгоритма на Pascal
- •Умножение двух положительных целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Сравнение двух целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Вычитание целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Реализация алгоритмов работы с целыми числами, представленными в виде строки на c#
Сравнение двух целых чисел, представленных в виде строки
Пусть у нас стоит задача сравнения двух целых чисел, представленных в виде строки. Например, надо сравнить «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;