- •Оглавление
- •Представление чисел в памяти эвм
- •Представление беззнаковых целых чисел в памяти эвм
- •Обратный код
- •Пример 1.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Пример 2.
- •Пример 3.
- •Пример 4.
- •Пример 5.
- •Важное следствие (пример 2).
- •Представление вещественных типов в памяти эвм
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 3
- •Пример 4
- •Алгоритмы работы с числами, которые представлены строкой
- •Сложение положительных чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Умножение положительного числа, представленного в виде строки, на одноразрядный коэффициент
- •Реализация алгоритма на Pascal
- •Умножение двух положительных целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Сравнение двух целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Вычитание целых чисел, представленных в виде строки
- •Реализация алгоритма на Pascal
- •Реализация алгоритмов работы с целыми числами, представленными в виде строки на c#
Умножение двух положительных целых чисел, представленных в виде строки
Пусть у нас стоит задача умножения двух целых чисел, представленных в виде строки, например «123» * «12».
Как это происходит?
-
1
2
3
1
2
2
4
6
1
2
3
0
В начале мы умножаем 123 на младший разряд (в этом случае 2). Потом умножаем на более старший разряд (в данном случае на 1). При этом результат умножения смещается на 1 разряд. Смещение выражается в том, что справа к результату дописывается ноль.
Таким образом, умножение можно записать 123*12=123*2+(123*1)*10.
Как видим, в данной записи у нас используются только операции суммирования, умножения числа на одноразрядный коэффициент, умножение числа на 10.
Однако в этой записи никак не фигурирует результат (как переменная, которая будет «накапливать» операции сложения). Поэтому умножение надо записать в следующем виде: 123*12= 0 + 123*2+(123*1)*10
Поэтому используя ранее написанные операции легко реализовать алгоритм умножения.
Получившийся алгоритм:
Инициализировать res (результат) «0»
Инициализировать смещение 0.
Для каждого символа второго числа, начиная с конца
Преобразовать символ в цифру
Первое число умножить на получившуюся цифру и результат умножения записать во временную строковую переменную.
От одного до смещение приписывать к временной переменной справа по одному нулю.
Увеличить смещение на 1
Просуммировать res и временную переменную и записать результат суммирования в res
Res – результат умножения двух чисел, представленных в виде строки.
Полный алгоритм реализации приведен ниже
Реализация алгоритма на Pascal
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;
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;
function getStrMul(const s1, s2 : string) : string;
var
res : string;
tempMul : string;
curVal : integer;
offset : integer;
i, j : integer;
begin
res := '0';
offset := 0;
for i := length(s2) downto 1 do
begin
tempMul := s1;
curVal := ord(s2[i]) - ord('0');
tempMul := getMul(tempMul, curVal);
for j := 1 to offset do
begin
tempMul := tempMul + '0';
end;
inc(offset);
res := getSum(res, tempMul);
end;
getStrMul := res;
end;