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

Умножение двух положительных целых чисел, представленных в виде строки

Пусть у нас стоит задача умножения двух целых чисел, представленных в виде строки, например «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

Поэтому используя ранее написанные операции легко реализовать алгоритм умножения.

Получившийся алгоритм:

  1. Инициализировать res (результат) «0»

  2. Инициализировать смещение 0.

  3. Для каждого символа второго числа, начиная с конца

    1. Преобразовать символ в цифру

    2. Первое число умножить на получившуюся цифру и результат умножения записать во временную строковую переменную.

    3. От одного до смещение приписывать к временной переменной справа по одному нулю.

    4. Увеличить смещение на 1

    5. Просуммировать res и временную переменную и записать результат суммирования в res

  4. 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;