Estoy tratando de implementar una clase BigInteger en C++. Pero, antes que nada, tengo una pregunta básica, ¿cómo se puede representar la "información base"? Por ejemplo, la forma más estúpida es tener una matriz fija (o dinámica) de char y almacenar cada número individual de un entero en una char. Pero, está bien, esta es una manera muy estúpida, y estoy aquí por tus sugerencias.C++ Big Integer
Respuesta
Hay un montón de sugerencias aquí para implementaciones existentes: C++ handling very large integers
Si usted tiene que poner en práctica su propia (por ejemplo, para hacer la tarea), entonces usted tiene que decidir la mejor manera, y cómo "grande" es necesario encargarse de. Puede usar una matriz de DWORD y controlar el desbordamiento de uno a otro.
Aunque, para algunas cosas de Project Euler, en realidad implementé una clase BigNumber basada en una cadena. Resultó ser el más simple de implementar para + - */y escalado a números significativamente más largos de los que podía obtener con unos unsigned long long
s. Y el rendimiento fue perfectamente adecuado para resolver esos rompecabezas.
Por lo tanto, enfrenta una compensación entre la facilidad de implementación y el rendimiento óptimo. Diviértete ;-)
Puedes crear un entero grande exactamente de la manera que describes. De hecho, la primera vez que implementé dicha clase, así es exactamente como lo hice. Me ayudó a implementar las operaciones aritméticas (+
, -
, etc.) ya que estaba en la base (10) a la que estaba acostumbrado.
Una mejora natural de su "matriz de caracteres" es mantenerlo en la base 10, pero utilice 4 bits para el dígito, en lugar de todo el byte. Por lo tanto, el número 123,456 podría estar representado por los bytes 12 34 56
en lugar de la cadena 123456
. (Tres bytes en lugar de seis.)
Desde allí, puede hacer el almacenamiento para el número en la base dos. Las operaciones aritméticas básicas como la adición funcionan exactamente igual en la base 2 que en la base 10. Por lo tanto, el número 65565 podría almacenarse utilizando los bytes FF FF
. (En un vector de unsigned char
s, por ejemplo). Algunas implementaciones de BigInts usan trozos más grandes, como short
o long
, por eficiencia.
Los enteros grandes de Base-10 pueden ser útiles si está haciendo una gran cantidad de visualización y/o serialización a base-10, y quiere evitar la conversión a base-2.
- 1. C++ integer floor function
- 2. Objective-C Integer Aritmética
- 3. C# - Lector binario en Big Endian?
- 4. C# little endian o big endian?
- 5. C# Big-endian ulong de 4 bytes
- 6. Cómo implementar big int en C++
- 7. Lua Integer tipo
- 8. Autoboxing: entonces puedo escribir: Integer i = 0; en lugar de: Integer i = new Integer (0);
- 9. Big O para while loops
- 10. FTS3 con columnas INTEGER
- 11. Reducir Integer fracciones Algoritmo
- 12. Sanitizing Integer Database Input
- 13. Uninitialized int vs Integer
- 14. Convertir BigDecimal en Integer
- 15. NSPredicate compare con Integer
- 16. Usando int vs Integer
- 17. Numpy integer nan
- 18. ¿Por qué hay Synchsafe Integer?
- 19. Big-O de .GetProperties()
- 20. Erlang y Big Numbers
- 21. Recursión y Big O
- 22. Little/Big Endian
- 23. Tricky Big-O complejidad
- 24. Comprensión de Big O
- 25. Big iPhone 5 Simulator?
- 26. Notación Big Oh
- 27. ¿Imitar/emular un comportamiento big-endian en C?
- 28. Notación Big Oh - definición formal
- 29. MySQL 'truncado valor INTEGER incorrectos'
- 30. python problems with integer comparison
posible duplicado de [Cómo implementar big int en C++] (http://stackoverflow.com/questions/269268/how-to-implement-big-int-in-c) – darioo
Si desea realizar el multi - Precisión matemática usted mismo, entonces le sugiero que eche un vistazo a [El arte de la programación de computadoras] de Donald Knuth (https://en.wikipedia.org/wiki/The_Art_of_Computer_Programming). Creo que el Volumen II, Algoritmos de Seminumerical, Capítulo 4, Aritmética de Precisión Múltiple, es lo que le interesa. También vea [Cómo agregar 2 enteros de tamaño arbitrario en C++?] (Https://stackoverflow.com/q/2926219/608639), que proporciona código para algunas bibliotecas C++ y OpenSSL. – jww