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

Алгоритмы работы с числами, которые представлены строкой

Исследование формата чисел конечно полезно, если программист хочет написать эффективную, быструю программу. Однако часто стандартных численных типов не хватает. Максимальная точность, которую можно получить – это 20 знаков. Поэтому возникает вопрос об альтернативных методах работы с числами.

Первый из них – представление больших чисел в виде строки. В этом случае точность составит уже 255 символов, но все равно она имеет свой максимальный предел. Если реализовывать работу на динамических массивах, в каждом элементе которого хранится одна цифра числа, то точность такого представления ограничена только объемом оперативной памяти. Но для начала точности в 255 цифр нам хватит.

Сложение положительных чисел, представленных в виде строки

Пусть у нас стоит задача сложение двух положительных чисел, которые представлены в виде строки. Например, в результате выполнения операции «17» + «11» мы получим 28.

Как это происходит? В школе нас научили сложению «столбиком».

1

7

1

1

2

8

Как нас научили, мы начинаем складывать с конца числа, поразрядно.

7 + 1 = 8

1 + 1 = 2.

Казалось бы, что алгоритм сложения будет выглядеть так: начиная с конца чисел складывать поразрядно и формировать результат.

Но это самый простой случай. Чуть усложним его.

Пусть у нас стоит задача сложить числа «17» и «2». Как это происходит?

1

7

0

2

1

9

Как видим, если слагаемые имеют разную длину, то мы дополняем меньшее из них спереди нулями до тех пор, пока они не станут равной длинны.

Поэтому алгоритм будет выглядеть следующим образом: Если числа имеют разное количество знаков, то дополнить меньшее из них нулями спереди до тех пор, пока они не станут равной длинны. Потом начиная с конца чисел складывать поразрядно и формировать результат.

Еще усложним наш пример. Что будет, если мы будем складывать «17» и «15»?

1

7

1

5

3

2

Результат сложения 7 и 5 – это 12. Но это больше 9, поэтому остается только 2, и появляется перенос в старший разряд.

Поэтому наш алгоритм будет выглядеть следующим образом: Если числа имеют разное количество знаков, то дополнить меньшее из них нулями спереди до тех пор, пока они не станут равной длинны. Потом начиная с конца чисел складывать поразрядно. Если результат поразрядного сложения больше 9, то вычесть из него 10 и установить флаг переноса. Если результат поразрядного сложения меньше 9, то сбросить флаг переноса. Записать результат текущего сложения разрядов в результат.

Это уже лучше. Однако у нас в этом алгоритме не отобразилось, на что влияет флаг переноса. Поэтому алгоритм примет следующий вид:

Если числа имеют разное количество знаков, то дополнить меньшее из них нулями спереди до тех пор, пока они не станут равной длинны. Потом начиная с конца чисел складывать поразрядно. Если флаг переноса установлен, то прибавить к сумме 1. Если результат сложения больше 9, то вычесть из него 10 и установить флаг переноса. Если результат сложения меньше 9, то сбросить флаг переноса. Записать результат текущего сложения разрядов в результат.

Это еще лучше. Но во фразе «Если флаг переноса установлен, то прибавить к сумме…» у нас профигурировал флаг переноса, хотя до этого в алгоритме он не встречался, что указывает на ошибку. Поэтому алгоритм сложения будет выглядеть следующим образом:

Сбросить флаг переноса. Если числа имеют разное количество знаков, то дополнить меньшее из них нулями спереди до тех пор, пока они не станут равной длинны. Потом начиная с конца чисел складывать поразрядно. Если флаг переноса установлен, то прибавить к сумме 1. Если результат сложения больше 9, то вычесть из него 10 и установить флаг переноса. Если результат сложения меньше 9, то сбросить флаг переноса. Записать результат текущего сложения разрядов в результат.

Теперь казалось бы, что все нормально. Но этот алгоритм подразумевает, что результат суммы имеет такое же количество разрядов, как и слагаемые (после дополнения нулями). Однако это не так. Примером может служить сумма 50 и 60 – результат будет 110, т.е. 3 разряда, а не 2. Поэтому алгоритм сложения будет выглядеть следующим образом:

Сбросить флаг переноса. Если числа имеют разное количество знаков, то дополнить меньшее из них нулями спереди до тех пор, пока они не станут равной длинны. Потом начиная с конца чисел складывать поразрядно. Если флаг переноса установлен, то прибавить к сумме 1. Если результат сложения больше 9, то вычесть из него 10 и установить флаг переноса. Если результат сложения меньше 9, то сбросить флаг переноса. Записать результат текущего сложения разрядов в результат. Если после окончания цикла флаг переноса установлен, то добавить к результату спереди 1.

Однако в данном алгоритме никак не прозвучало то, что числа хранятся в виде строки. Поэтому возникает вопрос о преобразовании символа, который хранится в элементе строки в соответствующий код (и наоборот, при формировании результата). Известно, что в ANSII кодировке цифры располагаются последовательно от 0 до 9 включительно. Это свойство мы и будем использовать в решении.

Еще не прозвучала инициализация результата сложения пустой строкой.

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