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

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

10 голосов
/ 26 октября 2008

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

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

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

неопределенная ссылка на BigInteger :: BigInteger (int) '<- их много. </p>

Вот мой код:

#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 ]

23 голосов
/ 26 октября 2008

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

#include <iostream>

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

    std::cout << num;
}
12 голосов
/ 26 октября 2008

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

unsigned long long int num = 600851475143ULL;
3 голосов
/ 26 октября 2008

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

2 голосов
/ 27 октября 2008

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

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

1 голос
/ 26 октября 2008

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

1 голос
/ 26 октября 2008

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

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

1 голос
/ 26 октября 2008

Есть ли libint lib для компоновки или bigint.cpp для компиляции?

0 голосов
/ 09 апреля 2013

Для тех, кто испытывает проблемы с этой библиотекой через пять лет после того, как был задан этот вопрос, это ответ для вас. Вы не можете просто скомпилировать вашу программу, она не сможет соединиться с ужасной непроходимой ошибкой! Эта библиотека представляет собой набор файлов 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 на имя вашей программы, вставьте эти строки в make-файл или скрипт, и все готово.

0 голосов
/ 08 марта 2011

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

...