Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 66 67 68 [ 69 ] 70 71 72 ... 78


книги использовала оператор new восемь раз в файле large.cpp и один раз в largepi.cpp.

Представление чисел

Наши целые числа неограниченного размера будут представлены в виде двоичных чисел. Их удобно представлять записанными в системе счисления с основанием В = 2 , где п - длина машинного слова. Мы будем группировать вместе последовательности п бит. Это напоминает обычный прием группировки четырех бит для записи битовых последовательностей в виде шестнадцатеричных чисел. Количество бит, используемое для пр>ед-ставления числа в классе large, всегда будет кратным п. Для 32-битных целых чисел (то есть когда и = 32 и sizeofiint) = 4) цифры будут находиться в диапазоне от О до 2 - 1 = 4 294 967 295.

Если мы увеличим последнее значение на 1, то не сможем хранить р>е-зультат в одной цифре - нам потребуются уже две цифры или 64 бита. Каждое число у нас будет представлено вектором, содержащим значения типа unsigned int вместе с флагом neg типа bool, который равен true, если данное число отрицательно, и false, если оно положительно или равно 0. Каждый элемент вектора будет содержать одну цифру в диапазоне от О до 2 . Для 32-битных целых чисел размер вектора в зависимости от значения представленного числа х будет следующим:

О, если х = 0, 1,еслиО<М<232,

2, если 232 < W < 2б4

3, если 2 < W < 296,

4, если 296 < 1л:] < 2128

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

арифметические операции +, -, *, /, % (и функцию divide, объединяющую / и %);

операции битового сдвига и ;

все перечисленные выше операции с одновременным присваиванием, что дает +=, -=, *=, /=, %=, = и =;

обычные перегруженные операторы ввода и вывода и ;

присваивание =;

сравнение ==, !=, <, >, <=, >=;

унарная операция изменения знака -;

функции abs для получения абсолютной величины числа, sqrt для вычисления квадратного корня и power для возведения в степень;



преобразование каждого из типов int, unsigned int, long и unsigned long к типу large. Кроме этого, определяется преобразование в тип large обычных строк в стиле С, char* (если эти строки содержат только десятичные цифры, которым может предшествовать знак минус);

функция num2char для преобразования числа типа large в символьное представление, записанное в экземпляре класса vector<char> в обратном порядке (см. замечание о переносимости в конце этого раздела).

Большая часть этих операций используется в демонстрационной программе largedem.cpp, которая приведена ниже.

largedem.cpp: Используем тип large, ♦include large.h int main О

{ large a = -10000, b = lOOOOU, с = 2000000L,

d = 100000000000000000000 , 20 нулей

X, у, z, u; X = (a * b * b + 1) * c; x-=c; x=a*b*b*c

X /= a * b; X = b * с

у = large( 1234567890123 ) % large( 1234567890000 ); if (X == b * с && у == large(123)) cout << Arithmetic OK endl;

z = power(d, 100); d в степени 100

= 10 в степени 2000 u = sqrt(z); 10 в степени 1000

if (u == power(large(10), 1000))

cout << u = 10 raised to the power 1000 << endl;

if (u < power(large(11), 1000) && u > power(large(9), 1000)) cout << Comparisons OK << endl;

vector<char> s; u.num2char(s);

cout << First character in output of u:

<< *(S.endO - 1) << endl; cout << u consists of << S.sizeO

<< decimal digits. endl;

z = d 100; z = d * (2b степени 100)

if (z == d * power(large(2), 100) && (z 100) == d)

cout << Shift operations OK << endl;

cout << -d << endl;

cout << Enter a large number x: ; cin x;



cout << 2 * X = 2 * X endl;

а = 123456789123456789 ; b = 999888777666 ;

large q, г;

a.divide(b, q, r, true); if (q != a/b I I r != a%b)

cout Function divide incorrect. << endl; return 0;

Вот вывод этой программы:

Arithmetic OK

u = 10 raised to the power 100 0 Comparisons OK

First character in output of u: 1 u consists of 1001 decimal digits. Shift operations OK -100000000000000000000

Enter a large number x: 999888777666555444333222111 2 * X = 1999777555333110888666444222

Рассмотренная программа показывает, что класс large упрощает работу с большими числами. Например, целое число =10 используется для вычисления

u = ->Tz= 10~

После проверки следующих условий выводится сообщение Comparisons OK: и = 10~

и > 9

Для демонстрации операций сдвига число d = 10 сдвигается на 100 двоичных позиций влево, что дает

2 = 1020 X 2оо

Этот результат проверяется с помощью функции power для вычисления значения 2 и сдвигом 2 на 100 позиций вправо, чтобы проверить, что результат снова оказывается равен d.

Переносимость

Программы в этом разделе были успешно протестированы со следующими версиями STL, упоминавшимися в разделе 1.2:



1 ... 66 67 68 [ 69 ] 70 71 72 ... 78

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика