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

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

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

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

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

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

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

  • ttmath (казался многообещающим, скомпилировал некоторые Большие примеры программ и запускались после некоторых исправлений из-за ошибок компиляции, непонятного синтаксиса из-за практически отсутствия documentantion)

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

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

--> обновление

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

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

  • Windows 7 Ultimate x64

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

  • Код::Блоки 10.05 версия без MinGW включена, имя файла " codeblocks-10.05-setup.exe " (установлен на C:Program файлы (x86)CodeBlocks)

  • пакеты MinGW (binutils-2.15.91-20040904-1 - ... смола.ГЗ ССЗ-ядро-3.4.2-20040916-1.смола.gz gcc-g++-3.4.2-20040916-1 - ... смола.gz mingw-время выполнения-3.11.смола.gz w32api-3.8.смола.GZ) извлеченный дальше C:MinGW

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

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

  • перейти к коду: блоки > настройки > компилятор и отладчик (мой компилятор был обнаружен здесь автоматически. если это не произойдет с вами, на "выбранный компилятор" выберите "GNU GCC Compiler" и нажмите "Установить по умолчанию", затем на "Toolchain Exectables" на " каталог установки компиляторов вы можете выбрать каталог установки компилятора или попытаться автоматически обнаружить" и с этим отсортированным на " компиляторе C++ "выберите или напишите" mingw32-g++".исполняемый." если это случится с вами просто сделайте это, на "выбранном компиляторе" выберите " GNU GCC Compiler "и нажмите"Установить по умолчанию").

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

  • чтобы начать кодирование с библиотекой "ttmath", вы должны поместить эту строку #include <ttmath/ttmath.h> перед основной функцией (Примечание: если вы используете 64-битную систему, вы получите много ошибок, если вы также не поместите эту строку #define TTMATH_DONT_USE_WCHAR до эта строка #include <ttmath/ttmath.h>, Я боролся с этим дерьмом, пока не нашел исправление, которое какой-то другой парень, который также боролся, нашел и опубликовал в интернете, и это работал на меня) п. s. я думаю, что это только для 64-битных систем, но если вы получаете ошибки только из-за включения "ttmath.H " header file это, скорее всего, из-за этого.

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

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

p.s. Используя эти простые правила для работы с целыми числами и этой библиотекой, я вычислил числа Фибоначчи до 100.000-го числа с помощью простой программы (которая заняла от 3 минут до кода) за 15 до 20 секунд, а число заняло как 3 страницы, поэтому, помимо того, что это практическая библиотека как только вы получите знать, как он работает (что у вас фактически нет помочь, некоторые образцы ttmath сайт очень вводит в заблуждение, но теперь вы имеете помощь) это также, кажется, довольно эффективный, я подтвердил, что 100.000-е число, вероятно, правы, потому что я увеличил размер ("н") от 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;}  

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

3 ответов


официальный сайт (http://www.ttmath.org/) и образцы С помощью целых чисел (ttmath::Int<2> a,b,c;) и плавающей запятой (ttmath::Big<1,2> a,b,c;) и другое. Просто относитесь к ним как к высокой точности int/float без членов и все должно быть нормально. Если ошибка остается, можете ли вы опубликовать полное сообщение об ошибке и строки кода, в которых она ошиблась?


несколько возможностей MIRACL, NTL и губ.


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