Большое число в C++

Я пытаюсь поместить большое число в переменную C++. Числа 600851475143

я попробовал unsigned long long int, но получил ошибку, сказав, что константа слишком велика. Затем я попробовал библиотеку bigInt под названием BigInt ->http://mattmccutchen.net/bigint/

проблема в том, что я не могу скомпилировать код, поскольку я получаю много ошибок относительно lib.

неопределенная ссылка на' BigInteger::BigInteger(int) '

здесь мой код до сих пор:

#include "string"
#include "iostream"       
#include "bigint/NumberlikeArray.hh"
#include "bigint/BigUnsigned.hh"
#include "bigint/BigInteger.hh"
#include "bigint/BigIntegerAlgorithms.hh"
#include "bigint/BigUnsignedInABase.hh"
#include "bigint/BigIntegerUtils.hh"
using namespace std;

int main() {

    //unsigned long int num = 13195;
    //unsigned long long int num = 600851475143;
    BigInteger num = 13195;
    int divider = 2;

    //num = 600851475143;

    while (1) {
        if ((num % divider) == 0) {
            cout << divider << 'n';
            num /= divider;
        }
        else
            divider++;

        if (num == 1)
            break;
    }
}

Если я ставлю меньшее число и не использую bigint lib, эта программа работает нормально. Любая помощь будет оценена: D

9 ответов


вы можете указать целочисленный литерал до тех пор, пока суффикс L.
Вы можете указать целочисленный литерал как long long суффиксом LL.

#include <iostream>

int main()
{
    long long num = 600851475143LL;

    std::cout << num;
}

число 600851475143 не слишком велико для длинного длинного int, но вам нужно использовать суффикс LL при использовании длинных длинных констант (ULL для unsigned long long int):

unsigned long long int num = 600851475143ULL;

Raison d'etre большой целочисленной библиотеки должен представлять целые числа, которые ваш язык не может обрабатывать изначально. Это означает, что вы даже не можете записать это как буквальное. Вероятно, эта библиотека имеет способ проанализировать строку как большое число.


в более общем случае, когда вы не можете поместить свой номер в длинный длинный и можете жить с лицензией GNU LGPL (http://www.gnu.org/copyleft/lesser.html), я бы предложил попробовать библиотеку GNU Multiprecision (http://gmplib.org/).

Это очень быстро, написано на C и поставляется с очень крутой c++-wrapper-library.


есть ли bigint lib для подключения или bigint.ЧГК для компиляции?


Если вы получаете неопределенные ссылочные ошибки для библиотеки bignum, вы, вероятно, не связали его. В Unix вам нужно будет передать такую опцию, как-lbigint. Если вы используете IDE, вам нужно будет найти настройки компоновщика и добавить библиотеку.

Что касается чисел, как уже было сказано, естественная константа по умолчанию имеет тип int. Вы должны использовать LL / ll, чтобы получить длинный длинный.


первое, что нужно сделать в этом случае, это выяснить, какое наибольшее число вы можете поместить в unsigned long long. Поскольку это 64 бит, наибольшее число будет 2^64-1 = 18446744073709551615, что больше вашего числа. Тогда вы знаете, что делаете что-то неправильно, и вы смотрите на ответ Мартина Йорка, чтобы увидеть, как это исправить.


попробуйте этот. В основном вы можете иметь свой собственный класс, который использует связанный список для хранения числа бесконечного размера. (RAM-это ограничение ) Попробуйте это https://mattmccutchen.net/bigint/


для всех, у кого есть проблемы с этой библиотекой через пять лет после того, как этот вопрос был задан, это ответ для вас. Вы не можете просто скомпилировать свою программу, она не сможет связать с уродливой непроницаемой ошибкой! Эта библиотека представляет собой набор файлов c++, которые вы должны компилировать .o файлы и ссылки на. Если вы посмотрите на вывод файла make, предоставленного с образцом программы, вы увидите следующее:

g++ -c -O2 -Wall -Wextra -pedantic BigUnsigned.cc
g++ -c -O2 -Wall -Wextra -pedantic BigInteger.cc
g++ -c -O2 -Wall -Wextra -pedantic BigIntegerAlgorithms.cc
g++ -c -O2 -Wall -Wextra -pedantic BigUnsignedInABase.cc
g++ -c -O2 -Wall -Wextra -pedantic BigIntegerUtils.cc
g++ -c -O2 -Wall -Wextra -pedantic sample.cc
g++ sample.o BigUnsigned.o BigInteger.o BigIntegerAlgorithms.o BigUnsignedInABase.o BigIntegerUtils.o -o sample

заменить sample С именем вашей программы, вставьте эти строки в makefile или скрипт,и вы уйдете.