- •Оглавление
- •Представление чисел в памяти эвм
- •Представление беззнаковых целых чисел в памяти эвм
- •Обратный код
- •Пример 1.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Важное следствие (пример 2).
- •Представление вещественных типов в памяти эвм
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 3
- •Пример 4
- •Алгоритмы работы с числами, которые представлены строкой
- •Сложение положительных чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Умножение положительного числа, представленного в виде строки, на одноразрядный коэффициент
- •Реализация алгоритма на Pascal
- •Умножение двух положительных целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Сравнение двух целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Вычитание целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Реализация алгоритмов работы с целыми числами, представленными в виде строки на c#
Реализация алгоритма на Pascal
Логика переменных:
s1, s2 – строки, в которых хранятся числа, которые ввел пользователь
res – строка, в которой будет записан результат сложения
flag – флаг переноса
i – счетчик цикла для того что бы проходить по элементам строки
num1, num2 – десятичное значение текущих разрядов в первом и втором числе соответственно.
sum – результат сложения текущих разрядов с учетом флага переноса.
sumChar – символ, в который записывается результат сложения текущих разрядов в виде символа.
function getSum(s1, s2 : string) : string;
var
res : string;
flag : boolean;
i : integer;
num1, num2 : byte;
sum : byte;
sumChar : char;
begin
res := '';
flag := false;
while (length(s1) < length(s2)) do
s1 := '0' + s1;
while (length(s2) < length(s1)) do
s2 := '0' + s2;
for i := length(s1) downto 1 do
begin
num1 := ord(s1[i]) - ord('0');
num2 := ord(s2[i]) - ord('0');
sum := num1 + num2;
if (flag) then
sum := sum + 1;
flag := (sum > 9);
if (sum > 9) then
sum := sum - 10;
sumChar := chr(sum + ord('0'));
res := sumChar + res;
end;
if (flag) then
res := '1' + res;
getSum := res;
end;
Умножение положительного числа, представленного в виде строки, на одноразрядный коэффициент
Пусть у нас стоит задача умножение положительного числа на одноразрядный коэффициент. Например, в результате выполнения операции «17» * «2» мы получим 34.
Как это происходит? Мы умножаем каждый разряд, начиная с конца числа, на коэффициент. В разряд результата мы заносим остаток от деления на 10, а в следующий разряд мы переносим целую часть от деления на 10.
Отличием от сложения чисел является то, то переносом может быть не только 1 или 0, а числа от 0 до 8. Поэтому флаг переноса нам уже не подойдет, необходима переменная типа byte. Остальной алгоритм почти не измениться.
Получившийся алгоритм:
В перенос записать 0
Инициализировать результат пустой строкой
От конца строки до начала
Преобразовать текущий символ в цифру
Умножить цифру на коэффициент
Добавить к полученному результату перенос
В перенос записать целую часть от деления результата на 10
В результат записать остаток от деления результата на 10
Преобразовать результат в символ
Добавить полученный символ в начало результирующей строки.
Если остался перенос, то
Преобразовать его в символ
Добавить полученный символ в начало строки.
Ниже приведено полное решение данной задачи.
Реализация алгоритма на Pascal
function getMul(s : string; k : byte) : string;
var
res : string;
i : integer;
carry : byte;
num : byte;
numChar : char;
begin
res := '';
carry := 0;
for i := length(s) downto 1 do
begin
num := ord(s[i]) - ord('0');
num := num * k;
num := num + carry;
carry := num div 10;
num := num mod 10;
numChar := chr(num + ord('0'));
res := numChar + res;
end;
if (carry > 0) then
begin
numChar := chr(carry + ord('0'));
res := numChar + res;
end;
{$B-}
while ((length(res) > 1) and (res[1] = '0')) do
delete(res, 1, 1);
getMul := res;
end;