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

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


(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 &quot, 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)



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

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