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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top