programas programación paso para ingenieros ejemplos dev completo comandos basicos c++ biginteger

programación - Gran número en C++



manual completo de c++ pdf (9)

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

Intenté unsigned long long int pero recibí un error al decir que la constante era demasiado grande. Luego probé una gran biblioteca llamada BigInt -> 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) ''<- lot 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 lib de BigInt, este programa funciona bien. Cualquier ayuda será apreciada: D


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


El número es 600851475143 no es demasiado grande para una int larga larga, pero necesita usar el sufijo LL cuando se usan constantes largas largas (ULL para unsigned long long int):

unsigned long long int num = 600851475143ULL;


Puede especificar un literal entero con el sufijo L.
Puede especificar un literal entero como largo por el sufijo LL.

#include <iostream> int main() { long long num = 600851475143LL; std::cout << num; }


Raison d''etre 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.


Si obtiene errores de referencia no definidos para la biblioteca de bignum, probablemente no lo 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 predetermina al tipo int. Debe usar LL / ll para obtener una larga larga.


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 muy genial C ++ - wrapper-library.


Lo primero que debe hacer en este caso es averiguar cuál es el número más grande que puede caber en un unsigned long long. 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.


Prueba 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) Inténtalo 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 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 observa el resultado del archivo make proporcionado 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

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