2008-10-26 3 views
10

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

Я пробовал беззнаковый длинный длинный 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

+0

Project Euler # 3 ... это сложная проблема ... У меня была такая же проблема. Я также посмотрел на BigInt lib, но я заметил, что они не реализовали операторы постфикса правильно ... поэтому я решил, что в их коде будут скрываться другие проблемы. – paxos1977 2008-10-27 16:27:09

ответ

23

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

#include <iostream> 

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

    std::cout << num; 
} 
12

Числа является 600851475143 не слишком велика, долго долго ИНТА, но вы должны использовать суффикс LL при использовании длинного длинные констант (Улла для неподписанного долгого долгого Int):

unsigned long long int num = 600851475143ULL; 
1

Есть ли в файле bigint lib ссылку или файл bigint.cpp для компиляции?

3

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

1

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

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

1

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

2

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

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

0

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

0

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

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 или сценарии, и прочь вы идете.

Смежные вопросы