|
Программирование >> Немодифицирующие последовательные алгоритмы
книги использовала оператор 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:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |