Обработка целых чисел произвольной длины в C ++

Может ли кто-нибудь рассказать мне о хорошей библиотеке C ++ для обработки (выполнения операций и т.д. ...) с произвольно большими числами (это может быть библиотека, которая также обрабатывает числа с плавающей запятой произвольной точности, но обработка целых чисел важнее)?

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

Для записи я использую Windows 7 на машине x64, CodeBlocks в качестве моей IDE и последний MinGW в качестве компилятора.

Библиотеки, которые я пробовал:

  • vlint (недостаточно операций, хотя и для мелочей работает нормально)

  • bigint (легко настроить, ошибки компиляции и немного документации (из которой могут быть получены ошибки))

  • ttmath (казался многообещающим, скомпилировал несколько БОЛЬШИХ примеров программ и запустил некоторые исправления из-за ошибок компиляции, непонятного синтаксиса из-за практически отсутствия документации)

  • gmp (даже не смог установить)

ps Удалена «напыщенная часть вопроса», которая в основном объясняла, почему я спрашиваю то, о чем много раз спрашивали в Stackoverflow, чтобы люди прочитали его до конца.

-> ОБНОВЛЕНИЕ

Итак, я выбрал ответ, который не был прямым ответом на мой первоначальный вопрос, но очень помог мне решить эту проблему, и я опубликую некоторые из своих выводов, чтобы помочь другим новичкам в C ++, таким как я начните работать с очень большими числами, не мучаясь с библиотеками в течение нескольких дней, как я сделал это в простом пошаговом микро-руководстве.

Материал, который я использовал (имейте это в виду, чтобы следовать руководству):

  • Windows 7 Ultimate x64

  • Amd k10 x64 (некоторые библиотеки не будут работать с этим, другие будут вести себя как по-другому, другие настроены на amd k10, так что это поможет вам не только с библиотекой, которую я использовал, но, возможно, и с другими)

  • Code :: Blocks 10.05 версия без MinGW, имя файла "codeblocks- 10.05-setup.exe "(установлен в C: \ Program Files (x86) \ CodeBlocks)

  • Пакеты MinGW (binutils-2.15.91-20040904-1.tar.gz gcc-core-3.4.2- 20040916-1.tar.gz gcc-g ++ - 3.4.2-20040916-1.tar.gz mingw-runtime-3.11.tar.gz w32api-3.8.tar.gz) извлеченный на C: \ MinGW

  • TTMath 0.9.2 имя файла "ttmath-0.9.2-src.tar.gz" распаковал и скопировал папку "ttmath" в папку "C: \ CPPLibs" (это папка, в которую я поместил свои библиотеки C ++)

Что делать, чтобы все это настроить

  • Перейдите в Код: Блоки> Настройки> Компилятор и отладчик (Мой компилятор был обнаружен здесь автоматически. Если с вами этого не происходит , в «Выбранном компиляторе» выберите «Компилятор GNU GCC» и нажмите «Установить по умолчанию», затем в «Исполняемые файлы Toolchain» в «Каталог установки компиляторов» вы можете выбрать каталог установки компилятора или попытка автоопределения »и с сортировкой на« Компиляторе C ++ »выберите или напишите« mingw32-g ++. exe ». Если это произойдет с вами , просто сделайте это, в« Выбранном компиляторе »выберите« GNU GCC Компилятор »и ​​нажмите« По умолчанию »).

  • Не выходя из «Код: Блоки> Настройки> Компилятор и отладчик» и разобрав все вышесказанное, перейдите в «Каталоги поиска», а затем «Компилятор» нажмите «Добавить» и выберите папку, в которой вы храните свои библиотеки или где вы поместите вашу папку "ttmath" (в моем случае C: \ CPPLibs), затем перейдите в "Linker" и сделайте то же самое.

  • Чтобы начать кодирование с помощью библиотеки "ttmath", вы должны поместить эту строку #include перед основной функцией ( ПРИМЕЧАНИЕ: Если вы используете В 64-битной системе вы получите много ошибок, если не поместите эту строку #define TTMATH_DONT_USE_WCHAR ПЕРЕД этой строкой #include , я боролся с этой чушью, пока не нашел исправление, которое нашел и разместил в сети какой-то другой парень, который тоже боролся, и это сработало для меня) p.s.Я думаю, это только для 64-битных систем, но если вы получаете ошибки только из-за включения файла заголовка "ttmath.h", скорее всего, из-за этого.

  • Объявление переменных , которые будут иметь большие целочисленные значения, должно выполняться следующим образом: ttmath :: UInt a, b, c; где «a, b, c» - ваши переменные, а «n» - это размер чисел, которые вы можете хранить в переменных в следующей форме: «2 ^ (32 * n) -1» для 32-битных систем и эта форма «2 ^ (64 * n) -1» для 64-битных систем. systems

  • Присвоение значений переменным , если вы сделаете это a = 333; (и число вместо 333 больше, чем стандартный тип данных "long int" в C ++) выиграл ' t компилируется, потому что присвоение значений подобным переменным независимо от размера, который вы указали ранее, целое число может быть таким же большим, как и стандартный тип данных "long int" на С ++ (я решил это самостоятельно, на собственном опыте), а также даже если вы используете меньшее значение и оно хорошо компилируется, а затем вы запускаете свою программу, и она пытается записать в эту переменную большее число, чем число, которое может обработать упомянутый стандартный тип данных "long int", тогда ваша математика будет будет wro ng, так что следите за этим: чтобы присвоить значение переменной правильным способом , вы должны присвоить его так a = "333"; (да, я знаю, что вы в значительной степени относитесь к этому как строку таким образом, но он будет выполнять операции нормально без каких-либо проблем, и если вы решите "cout" переменную, это никогда не будет экспоненциальным или научным результатом нотации, как вы используете стандартные целочисленные типы данных, не связанные с некоторыми ' дополнительные операторы 'для правильного отображения числа)

psИспользуя эти простые правила для работы с целыми числами и этой библиотекой, я вычислял числа Фибоначчи до 100000-го числа с помощью простой программы (код которой занимал около 3 минут) за 15-20 секунд, и число занимало как 3 страницы, так что помимо того, что это было практичным библиотека, как только вы узнаете, как она работает (раньше у вас практически не было помощи, некоторые образцы веб-сайта ttmath вводят в заблуждение, но теперь у вас есть помощь), она также кажется довольно эффективной, я подтвердил, что 100000-е число - это вероятно, прав, потому что я увеличил размер («n») с 10000 до 50000, и число сохранило размер, а начальная и конечная цифры были такими же. Это исходный код, который я использовал, я использовал ОЧЕНЬ БОЛЬШОЕ число для целочисленного размера, просто чтобы проверить, я фактически не удосужился посмотреть, с какой длины программа начнет делать что-то неправильно, но я знаю, что длина до 10.000-е число Фибоначчи не будет превышать длину, которую я определил, потому что до этого я делал программу «cout» для каждого результата, пока оно не достигло 10.000-го, и оно всегда росло. Я также проверил первые числа последовательности раньше, когда я приостановил программу, и я увидел, что «цифры растут», и подтвердил первые числа Фибоначчи последовательности, и они были правильными. ПРИМЕЧАНИЕ: Этот исходный код будет отображать только номер последовательности Фибоначчи, которую вы хотите знать, он покажет вам только «растущие» числа, если вы раскомментируете закомментированные строки.

#define TTMATH_DONT_USE_WCHAR
#include <ttmath/ttmath.h>
#include <iostream>

using namespace std;
int main () {

int fibonaccinumber;
cin >> fibonaccinumber;
cin.ignore();

ttmath::UInt<10000> fibonacci1,fibonacci2,fibonacci3;
fibonacci1 = 1;
fibonacci2 = 1;
//cout << "1. " << fibonacci1 << "\n2. " << fibonacci2 << "\n";

for(int i=3;i<=fibonaccinumber;i++)
{fibonacci3 = fibonacci1 + fibonacci2;
//   cout << i << ". " << fibonacci3 << "\n";
fibonacci1=fibonacci2;
fibonacci2=fibonacci3;}

cout << "the " << fibonaccinumber << "th fibonacci number is " << fibonacci2;

string endprog;
getline(cin,endprog);
return 0;}  

Я еще не возился с поплавками произвольной точности в этой библиотеке, но когда я это сделаю, я продолжу расширять это руководство, если я увижу, что люди заинтересованы в нем, спасибо за все комментарии и ответы.

13
задан wxiiir 23 October 2013 в 01:49
поделиться