Pregunta

Estoy tratando de colocar un gran número en una variable de C ++. El número es 600851475143

Intenté unsigned long long int pero recibí un error que decía que la constante era demasiado grande. Luego probé una biblioteca bigInt llamada BigInt - & Gt; http://mattmccutchen.net/bigint/

El problema es que no puedo compilar el código ya que recibo muchos errores con respecto a la lib.

referencia indefinida a `BigInteger :: BigInteger (int) '< - muchos de estos.

Aquí está mi código hasta ahora:

#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;
    }
}

Si pongo un número más pequeño y no uso la biblioteca BigInt, este programa funciona bien. Cualquier ayuda será apreciada: D

¿Fue útil?

Solución

Puede especificar un literal entero siempre que el sufijo L.
Puede especificar un literal entero siempre que el sufijo LL.

#include <iostream>

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

    std::cout << num;
}

Otros consejos

El número es 600851475143 no es demasiado grande para un int largo largo pero necesita usar el sufijo LL cuando se usan constantes largas largas (ULL para int largo largo sin signo):

unsigned long long int num = 600851475143ULL;

La razón de ser de una gran biblioteca de enteros es representar enteros que su idioma no puede manejar de forma nativa. Eso significa que ni siquiera puedes escribirlo como literal. Probablemente, esa biblioteca tiene una forma de analizar una cadena como un gran número.

En un caso más general, cuando no puede ajustar su número en mucho tiempo y puede vivir con la licencia GNU LGPL ( http://www.gnu.org/copyleft/lesser.html ), sugeriría probar la GNU Multiprecision Library ( http://gmplib.org/ ).

Es extremadamente rápido, está escrito en C y viene con una muy buena biblioteca de envolturas en C ++.

¿Hay una lib de bigint para vincular o una bigint.cpp para compilar?

Si obtiene errores de referencia indefinidos para la biblioteca bignum, probablemente no lo vinculó. En Unix, deberá pasar una opción como -lbigint. Si está utilizando un IDE, deberá encontrar la configuración del vinculador y agregar la biblioteca.

En cuanto a los números, como ya se ha dicho, una constante natural por defecto es de tipo int. Debe usar LL / ll para alargarse mucho.

Lo primero que debe hacer en este caso es averiguar cuál es el número más grande que puede caber en un largo largo sin signo. Como es de 64 bits, el número más grande sería 2 ^ 64-1 = 18446744073709551615, que es mayor que su número. Entonces sabes que estás haciendo algo mal y miras la respuesta de Martin York para ver cómo solucionarlo.

Prueba este. Básicamente, puede tener su propia clase personalizada que utiliza una lista vinculada para almacenar el número de tamaño infinito. (RAM es la restricción) Prueba este https://mattmccutchen.net/bigint/

Para cualquier otra persona que tenga problemas con esta biblioteca cinco años después de que se hizo esta pregunta, esta es la respuesta para usted. No puede simplemente compilar su programa, ¡no se vinculará con un error feo e impenetrable! Esta biblioteca es una colección de archivos de C ++ que se supone que debe compilar en archivos .o y con los que enlazar. Si observa el resultado del archivo make proporcionado con el programa de muestra, verá esto:

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

Reemplace sample con el nombre de su programa, pegue estas líneas en un archivo MAKE o script, y listo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top