Pergunta
Eu estou tentando colocar um grande número em uma variável C ++. O número é 600851475143
Eu tentei unsigned int longo tempo, mas tenho um erro dizendo que a constante era muito grande. Então eu tentei uma biblioteca BigInt chamado BigInt -> http://mattmccutchen.net/bigint/
O problema é que não consigo compilar o código que eu recebo muitos erros a respeito da lib.
undefined reference to `BigInteger :: BigInteger (int)'<-. Lote de estes
Aqui está o meu código até agora:
#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;
}
}
Se eu colocar um número menor e não use o BigInt lib este programa funciona muito bem. Qualquer ajuda será apreciada: D
Solução
Você pode especificar um número inteiro literal, desde pelo sufixo L.
Você pode especificar um número inteiro literal, desde muito tempo pelo LL sufixo.
#include <iostream>
int main()
{
long long num = 600851475143LL;
std::cout << num;
}
Outras dicas
O número é 600851475143 não é muito grande para um long int longo, mas você precisa usar o sufixo LL ao usar um longo constantes (ULL para unsigned int long long):
unsigned long long int num = 600851475143ULL;
Raison d'etre de uma biblioteca inteira grande é para representar números inteiros que seu idioma não podem lidar de forma nativa. Isso significa que você não pode mesmo anotá-la como um literal. Provavelmente, essa biblioteca tem uma maneira de analisar uma string como um número grande.
Em um caso mais geral, quando você não pode caber o seu número em um longo, e pode viver com a licença GNU LGPL ( http://www.gnu.org/copyleft/lesser.html ), gostaria de sugerir tentar o multiprecision Biblioteca GNU ( http://gmplib.org/ ).
Ele é extremamente rápido, escrito em C e vem com um C ++ muito legal -. Wrapper de biblioteca
Existe uma lib bigint a ligação ou um bigint.cpp para compilar?
Se você estiver recebendo erros de referência indefinidos para a biblioteca bignum, você provavelmente não vinculá-lo. No Unix, você terá que passar por uma opção como -lbigint. Se você estiver usando um IDE, você terá que encontrar as configurações do vinculador e adicione a biblioteca.
Quanto aos números, como já foi dito, um natural padrões constantes de tipo int. Você deve usar LL / ll para obter um longo tempo.
A primeira coisa a fazer neste caso é para descobrir o que é o maior número que você pode caber em um unsigned long long. Uma vez que é de 64 bits, o maior número seria 2 ^ 64-1 = 18446744073709551615, que é maior do que o seu número. Então você sabe que você está fazendo algo errado, e você olha para a resposta por Martin York para ver como corrigi-lo.
Tente este. Basicamente, você pode ter sua própria classe personalizada que usa lista ligada para armazenar o número de tamanho infinito. (RAM é a restrição) Tente este https://mattmccutchen.net/bigint/
Para qualquer outra pessoa tendo problemas com este programa de cinco anos após esta pergunta foi feita, esta é a resposta para você. Você não pode apenas compilar seu programa, ele vai deixar de ligação com um erro impenetrável feio! Esta biblioteca é uma coleção de arquivos C ++ que você deve para compilar para .o arquivos e ligação contra. Se você olhar para a saída do arquivo make fornecido com o programa de exemplo que você vai ver isso:
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
Substituir sample
com o nome do seu programa, colar estas linhas em um makefile ou script, e você vai longe.