|
Программирование >> Немодифицирующие последовательные алгоритмы
(1) Visual С++ (версия 5.0). (2) Адаптация SGI STL для Visual С++ 5.0 от Учида. (3) Borland С++ (версия 5.2). Поскольку алгоритмы min и max вызывали проблемы с версией, помеченной (1), мы добавляем следующую строчку, чтобы проверить, используется ли эта версия: #if (defined( MSC VER) && !defined( SGI MSVC)) 8.2. Реализация класса large Только что упомянутая строка препроцессора находится в следующем файле заголовка largeh, который мы использовали в программе largedem.cpp: II large.h: Многоразрядная целочисленная арифметика, ♦include <iostream> ♦include <vector> ♦include <iterator> using namespace std; typedef unsigned int uint; typedef vector<uint> vec; class large { public: large(const char *str); large(int i); large(uint i=0); large(long i); large operator-()const; large &operator+=(const large &y); large &operator-=(const large &y); large &operator*=(int y); large &operator*=(uint y); large &operator*=(large y); large &operator/=(const large &divisor); large &operator%=(const large &divisor); large &operator<<=(uint k); large &operator = (uint k); void divide(large denom, large ", large &rem, bool RemDesired)const; Функция num2char преобразует объект x класса large в его символьное представление s в обратном порядке: void num2char(vector<char> &s) const; int compare(const large &y)const; private: vec Р; bool neg; void SetLen(int n); void reduce!); void DDproduct(uint A, uint B, uint &Hi, uint &Lo)const; uint DDquotient(uint A, uint B, uint d)const; void subtractmuKuint *a, uint *b, int n, uint &q)const; bool normalize(large &denom, large &num, int &x)const; void unnormalize(large &rem, int x, bool SecondDone)const; large operator*(large x, const large &y) large operator-(large x, const large &y) large operator*(large x, const large &y) large operator/(large x, const large &y) large operator%(large x, const large &y) large operator (large u, uint k); large operator (large u, uint k); ostream &operator<<(ostream &os, const large &x); istream &operator (istream &os, large &x); bool operator==(const large &x, const large &y); bool operator<(const large &x, const large &y); bool operator!=(const large &x, const large &y); bool operator>(const large &x, const large &y); large abs(large x); large sqrt(const large &a); large powerdarge x, uint n); #if (defined( MSC VER) && !defined( SGI MSVC)) template <class T> inline const T& min(const T& a, const T& b) { return a < b ? a : b; template <class T> inline const T& max(const T& a, const T& b) { return a < b ? b : a; #endif Значение большинства открытых (public) членов этого класса должно быть понятно из нашего обсуждения программы largedem.cpp. Обратите внимание, что мы определяем только два оператора сравнения - == и <. Четыре остальных оператора (!=, >, <=, >=) определяются шаблонами STL, как объяснено в разделе 2.8. В классе large присутствуют всего две переменные-члена - Р и neg, определенные после ключевого слова private как vec Р; bool neg; Взглянув на определение typedef выше в файле, мы увидим, что тип vec означает vector<unsigned int>. Мы уже упоминали, что Р представляет абсолютное значение большого числа, тогда как neg показывает, является ли число отрицательным. Ранняя версия класса large, не использующая STL, содержала указатель типа uint* вместо vec Р, и в ней имелись еще две переменных-члена класса, 1еп и Len, которые указывали логическую и физическую длину. Они соответствуют функциям-членам STL size и capacity (см. раздел 3.2). Теперь эти две длины полностью обрабатываются STL. Мы не будем обсуждать все подробности реализации класса large; в отдельных местах текста присутствуют поясняющие комментарии, помогающие разобраться, как устроена эта реализация. После компиляции следующий файл должен быть скомпонован {link) с программой, которая использует класс large: II large.cpp: Многоразрядная целочисленная арифметика, значения 10, 20, 30 и 40 использующая STL. iinclude <iostream> iinclude <strstreani> iinclude <iomanip> iinclude <stdlib.h> iinclude <limits.h> iinclude <string> iinclude <ctype.h> iinclude large.h const uint uintmax = UINT MAX; const int wLen = sizeof(uint) * 8; Количество бит const int hLen = wLen/2; const uint rMask = (1 hLen) - 1; const uint iMask = uintmax - rMask; const uint IBit = uintmax - (uintmax 1); Добавить нули или удалить элементы в конце, то есть в позициях старших разрядов, void large::SetLen(int LenNew) { int LenOld = P.sizeO; if (LenNew > LenOld)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |