Автор: Пользователь скрыл имя, 24 Декабря 2010 в 10:28, курсовая работа
Цель моей курсовой работы заключается в реализации структур и алгоритмов для работы с «длинными» числами для последующего использования их в вычислениях. Скорость работы алгоритмов сильно зависит от выбора основания системы счисления (BASE).
Введение 3
1. Структуры, алгоритмы классических «длинных» чисел 5
1.1 Структура класса «BigInt» 6
1.2 Операции над большими числами 7
2. Структуры и алгоритмы факториальной длинной арифметики 10
2.1 Структура факториальной длинной арифметики 10
2.2 Функции и операции над числами факториальной арифметики 11
3. Сравнение систем счисления 15
3.1 Набор необходимых для сравнения инструментов 15
3.2 Сравнение систем счисления 16
Заключение 20
Список использованной литературы 21
Приложение: Class BigInt, функции для работы с классом 22
Из табл.2 заметим, что при 100тыс. десятичных знаков использовалось 25,2 тыс. знаков в факториальной математике и 10,4 тыс. знаков системы 232. Число показывает, во сколько раз количество разрядов в системе счисления, основанной на факториалах больше количества разрядов в системе 232 при длине десятичного представления того же самого числа равного 100тыс.
При 1000тыс. десятичных знаков получаем коэффициент , которое меньше .
Можно предположить, что при длине десятичного числа намного превосходящего 1млн. знаков коэффициент станет и система счисления, основанная на факториалах, будет выгоднее в плане использования памяти, нежели система 232. Практически такого десятичного числа не удалось посчитать из-за недостаточного количества оперативной памяти и мощности процессора.
б.) Производительность операций умножения и деления.
Проведем несколько тестов на различных системах счисления, в которых будем 1000 раз производить операции умножения, зафиксируем их на графике зависимости времени работы алгоритма от количества десятичных разрядов чисел, участвующих в операции умножения.
рис.3 Произведение
На рисунке 3 показана зависимость времени работы операции умножения от количества разрядов десятичных чисел. Начиная примерно с 1950 десятичных знаков, система счисления на факториалах имеет выигрыш во времени по отношению к десятичной. Но, тем не менее, система счисления 232 в десятки, а то и в сотни раз работает быстрее.
рис.4 Деление
Аналогичные действия проводим с операцией деления. Рассмотрим рис. 4. График схож с графиком на рис.3. Видно, что начиная также с 1950знаков факториальная система счисления выигрывает по времени у десятичной, система 232 по-прежнему выигрывает в разы у остальных.
Подводя некоторый итог, можно сказать, что система счисления, основанная на факториалах имеет преимущество у десятичной, как по используемой памяти, так и по производительности. Система счисления 232 выгоднее десятичной и факториальной.
Заключение
В процессе работы над данной темой был создан класс для работы с длинными числами, написаны функции для основных арифметических операций (для десятичной системы счисления и для факториальной системы счисления), а также две функции перевода чисел из факториальной системы счисления в десятичную и обратно.
Также была проведена серия тестов, подтверждающая то, что при работе с длинными числами, факториальная система счисления дает выигрыш по времени и объему затрачиваемой оперативной памяти, по сравнению с десятичной системой счисления.
Было замечено, что при операциях с длинными числами в факториальной системе счисления, имеющих 30 разрядов и более, объем, занимаемый этими числами в оперативной памяти меньше объема этих же чисел, представленных в десятичной системе счисления.
Список использованной литературы
Содержимое файла-заголовка cursovaya.h:
#include "string"
#define BASE 10
#define MAX_DIG 100000
using namespace std;
// The determination of Class BigInt
class BigInt {
public:
long Size;
int Coef[MAX_DIG];
BigInt();
BigInt(const string&);
BigInt(int);
BigInt(const BigInt&);
virtual ~BigInt();
void zero();
void update();
BigInt operator =(const BigInt&);
void random(int);
BigInt operator +(BigInt);
BigInt operator ++(int);
BigInt operator -(BigInt&);
BigInt operator *(const int);
BigInt operator *(BigInt&);
BigInt operator /(BigInt&);
BigInt operator %(BigInt&);
// Factorial <- Dec
void FacToDec();
operator long();
};
// Main operations of Factorial Algebra
bool operator<(BigInt&, BigInt&);
bool operator<=(BigInt&, BigInt&);
bool operator==(BigInt&, BigInt&);
bool operator!=(BigInt&, BigInt&);
bool operator>(BigInt&, BigInt&);
bool operator>=(BigInt&, BigInt&);
//Number output
ostream& operator<<(ostream&, const
BigInt&);
// Factorial <-> Dec
BigInt FacToDec(BigInt);
BigInt
DecToFac(BigInt);
// The comparison of two numbers: int and BigInt
short cmp(int &,int &);
short cmp(BigInt &,BigInt &);
// Division in DEC system
BigInt Div_int(const BigInt &, const int);
int Div_int_rm(const BigInt &, const int);
// Operations in Fact system
BigInt Div_Int_Fac(BigInt &,const int);
int Div_Int_Fac_rm(BigInt &,const int);
void Mul(const BigInt&, const BigInt&, BigInt&);
Содержимое файла сursovaya.cpp с исходным кодом класса:
#include "cursovaya.h"
#include "math.h"
#include "time.h"
#define BASE_DIG 1
short cmp(int &a,int &b){
if (a==b) return 0;
if (a>b) return 1;
if (a<b) return -1;
return NULL;
}
short cmp(BigInt &A, BigInt &B){
if (A==B) return 0;
if (A>B) return 1;
if (A<B) return -1;
return NULL;
}
bool ifnull(BigInt &A){
if(A.Size==1 && A.Coef[0]==0)
return true;
return false;
}
BigInt::BigInt() {
memset(Coef,0,sizeof(
Size = 1;
}
BigInt::BigInt(const string &str){
int k=0;
Size = (long)str.length();
memset(Coef,0,sizeof(int
for(int j=Size-1; j>=0; j--){
Coef[k] = str[j]-'0';
k++;
}
}
BigInt::BigInt(const BigInt &A) {
Size = A.Size;
memcpy(Coef,A.Coef,sizeo
}
BigInt::BigInt(int count){
memset(Coef,0,sizeof(int
this -> Size = count;