Вопрос

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

Я пробовал unsigned long long int, но получил ошибку, указав, что константа слишком велика. Затем я попробовал библиотеку bigInt под названием BigInt - & Gt; 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

Это было полезно?

Решение

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

#include <iostream>

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

    std::cout << num;
}

Другие советы

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

unsigned long long int num = 600851475143ULL;

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top