2008-10-26 21 views
10

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

Intenté unsigned long long int pero recibí un error al decir que la constante era demasiado grande. Luego probé una biblioteca llamada Bigint Bigint ->http://mattmccutchen.net/bigint/

El problema es que no puedo compilar el código como consigo muchos errores en cuanto 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 el Bigint lib este programa funciona muy bien. Cualquier ayuda será apreciada: D

+0

Proyecto Euler # 3 ... ese es un problema difícil ... tuve el mismo problema. También miré BigInt lib, pero me di cuenta de que no implementaban correctamente los operadores de postfix ... así que pensé que habría otros problemas al acecho en su código. – paxos1977

Respuesta

23

Puede especificar un literal entero, siempre con el sufijo L.
Puede especificar un literal entero, siempre y largo por el sufijo LL.

#include <iostream> 

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

    std::cout << num; 
} 
12

El número es 600 851 475 143 no es demasiado grande durante mucho tiempo int pero hay que usar el sufijo LL cuando se utiliza un largo constantes (ULL para unsigned int largo, largo):

unsigned long long int num = 600851475143ULL; 
1

¿Hay una letra grande para enlazar o bigint.cpp para compilar?

3

Raison d'étre 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 un literal. Probablemente, esa biblioteca tiene una forma de analizar una cadena como un gran número.

1

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

En cuanto a los números, como ya se ha dicho, una constante natural se establece de forma predeterminada en el tipo int. Debe usar LL/ll para obtener una larga larga.

1

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 sin firmar. Dado que es de 64 bits, el número más grande sería 2^64-1 = 18446744073709551615, que es más grande que su número. Entonces sabes que estás haciendo algo mal, y miras la respuesta de Martin York para ver cómo solucionarlo.

2

En un caso más general, cuando no puede adaptarse a su número en mucho tiempo, y puede vivir con la licencia GNU LGPL (http://www.gnu.org/copyleft/lesser.html), le sugiero que pruebe la Biblioteca de Multiprecision de GNU (http://gmplib.org/).

Es extremadamente rápido, está escrito en C y viene con una genérica C++ - wrapper-library.

0

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

0

Para cualquier otra persona tienen problemas con esta biblioteca de cinco años después de que se hizo esta pregunta, esta es la respuesta para usted. No puedes simplemente compilar tu programa, ¡no podrá vincularlo con un feo error impenetrable! Esta biblioteca es una colección de archivos C++ que se supone que debes compilar en archivos .o y enlazar. Si nos fijamos en la salida del fichero make provisto con el programa de ejemplo 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 

Reemplazar sample con el nombre de su programa, pegar estas líneas en un archivo MAKE o script, y ya está.

Cuestiones relacionadas