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

Реализация алгоритма на 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. Остальной алгоритм почти не измениться.

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

  1. В перенос записать 0

  2. Инициализировать результат пустой строкой

  3. От конца строки до начала

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

    2. Умножить цифру на коэффициент

    3. Добавить к полученному результату перенос

    4. В перенос записать целую часть от деления результата на 10

    5. В результат записать остаток от деления результата на 10

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

    7. Добавить полученный символ в начало результирующей строки.

  4. Если остался перенос, то

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

    2. Добавить полученный символ в начало строки.

Ниже приведено полное решение данной задачи.

Реализация алгоритма на 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;