Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пояснительная записка-2.doc
Скачиваний:
29
Добавлен:
20.09.2019
Размер:
194.56 Кб
Скачать

Класс BigInt

В этом классе содержатся следующие переменные:

int sz – размер числа в байтах.

byte[] pd – массив байтов

Продолжим разбор класса описанием конструкторов.

Конструктор, создающий целое неограниченное число из базового типа данных long:

BigInt(long n).

Пустой конструктор:

BigInt().

Конструктор, создающий целое неограниченное число из строки:

BigInt(String str).

Конструктор копирования:

BigInt(BigInt R).

В классе имеются приведенные ниже методы.

public int Get(String s)

Метод преобразует строку в целое неограниченное число, используя метод In, который непосредственно преобразует строку в число.

public String Put()

Метод преобразует целое неограниченное число в строку. Этот метод также использует непосредственный метод Out, который преобразует число в строку.

public int Load(InputStream I) throws Exception

Загрузка неограниченного числа из символьного потока. В данном методе промежуточный результат (размер числа в байтах) записываем в объект класса, входящего в проект, так как для этого класса уже определен метод загрузки целого числа из символьного потока.

//-----------------------------------------------------------------------

public int Load(InputStream I) throws Exception

{

integer sz_n=new integer(0);

sz_n.Load(I);

sz=sz_n.val;

pd=new byte[sz];

I.read(pd);

return 1;

}

//-----------------------------------------------------------------------

public void Save(OutputStream O) throws Exception

Метод сохраняет неограниченное число в символьный поток.

public void BLoad(FileInputStream I) throws IOException, ClassNotFoundException

Метод загружает неограниченное число из файлового потока. Алгоритм метода схож с алгоритмом реализации загрузки списка из файлового потока в классе TList.

public void BSave(OutputStream O) throws IOException

Данный метод сохраняет неограниченное число в файловый поток. Алгоритм также использует сериализацию.

public int Type()

Метод возвращает идентификатор класса.

public String Name()

Метод возвращает имя класса.

public int Cmp(object q)

Метод сравнивает текущий объект с объектом q.

public object Copy()

Метод создает динамическую копию объекта.

public int Add(object q)

Метод складывает текущий объект с объектом q.

public boolean getsign()

Методы возвращают знак неограниченного числа. True – «-».

public boolean inc()

Метод наращивает число на 1.

void neg()

Метод обращает число, т.е. положительное преобразует в отрицательное и наоборот.

void denormalize(int n)

Метод расширяет число до размера n, путем добавления новых элементов в динамический массив байтов. Значение добавленных элементов зависит от знака числа. Если число отрицательное, то добавленные элементы равны 0х00, иначе 0хFF.

void normalize()

Метод обратный методу denormalize. Данный метод убирает лишние элементы динамического массива байтов.

public void In(String str)

Метод непосредственного преобразования строки в неограниченное число.

//-----------------------------------------------------------------------

public void In(String str)

{

int i;

for (i=0;i<sz;i++) pd[i]=0;

i=0;

if (str.charAt(0)=='+' || str.charAt(0)=='-') i=1;

for (; i<str.length();i++)

{

int c=str.charAt(i)-'0';

if (c<0 || c>9) continue;

mul(new BigInt(10));

add(new BigInt(c));

}

//-----------------------------------------------------------------------

Данный метод работает по принципу последовательного умножения текущего неограниченного числа на 10 и прибавления очередной цифры из строки.

int GetNum()

Метод возвращает количество цифр в неограниченном числе.

//-----------------------------------------------------------------------

int GetNum()

{

BigInt p=(BigInt) this.Copy();

BigInt a=new BigInt(10);

int i;

for(i=1;p.pd[0]!=0;i++)

p=p.sdiv((BigInt)a.Copy());

return (getsign() || pd[0]==0) ? i : i-1;

}

//-----------------------------------------------------------------------

Получения количества цифр осуществляется за счет последовательного деления текущего неограниченного числа на 10. Метод также учитывает знак числа.

void lshift() и void rshift()

Методы сдвига неограниченного числа на один разряд влево и вправо соответственно.

void mul(BigInt R)

Метод перемножает текущее число и число R. Данная функция перемножает числа без учета знака, т.е. только положительные числа.

public void smul(BigInt R)

Метод перемножает текущее число и число R. Данная функция перемножает числа не зависимо от их знака.

public BigInt sdiv(BigInt R)

Метод деления текущего числа на число R. Данная функция вызывает функцию деления с учетом знака и не изменяет текущее число.

void __sdiv(BigInt R)

Метод деления текущего числа на число R с учетом знака. Данная функция записывает результат деления в текущее число.

void div(BigInt R1)

Метод деления текущего числа на число R1. Данная функция делит положительные числа, т.е. без учета знака.

public void add(BigInt R)

Метод прибавления к текущему числу число R. Результат записывается в текущее число.

public void sub(BigInt R)

Метод вычитания из текущего числа число R.

public int GetSize()

Метод получения размера числа в байтах.

public byte GetPD(int n)

Метод получения n-ого байта числа.

BigInt mod(BigInt R)

Метод взятия остатка от деления текущего числа на число R.

public String Out()

Метод непосредственного преобразования неограниченного числа в строку.

Данный метод работает по принципу последовательного взятия остатка при делении на 10, т.е. последовательного получения последней цифры числа и записи её в выходную строку. Затем реверсируем полученную строку и получаем необходимый результат.

Все арифметические операции данного класса построены на алгоритмах поразрядных арифметических операций. Например, умножение двух чисел:

, где bjj-ый разряд числа b. 2i – реализует метод сдвига числа влево. Доступ к определенному разряду числа осуществляется при помощи сдвигов и взятия значения по маске, используя поразрядную операцию «и».