2012-06-14 24 views
5

¿Qué es un algoritmo escalable para imprimir un entero de 0 dígitos N-binarios manualmente cuyo valor no se ajusta a long long. Sé printf y amigos, junto con <iostream> (que muy probablemente Piggy-Back sobre <cstdio> tienen esta orden interna para los tipos estándar, pero me gustaría que lo haga por un entero compuesto de N bytes.impresión manual de un número entero de 0 bytes

He pensado en esto y googleó un poco, pero siempre se reduce a usar una libigery bigint preexistente como GMP (una base de código con la que no estoy familiarizado) o "use printf" o la más útil "esto es difícil".

El número entero es básicamente:

template<size_t N> 
class Integer{ 
... 
private: 
    int8_t first; 
    uint8_t rest[N-1]; 
} 

así reinterpretación de bytes una Integer<4> 's w debería obtener un int32_t. Me gustaría escalar esto a N> 8. La eficiencia no es realmente mi preocupación en este momento. Tampoco lo es endianness (esto es para x86).

+2

Supongo que necesita imprimir el número en decimal? – NPE

+0

@aix sí decimal sería la idea. – rubenvb

+0

Mi consejo sería usar una biblioteca bigint de todos modos; esas bibliotecas están depuradas y probadas. ¿Cómo encontrará fallas en su propia codificación? No es como si fuera a verificar los resultados con lápiz y papel o en Excel. – tomdemuyt

Respuesta

5

Paso 1: Definir una tabla de consulta que contiene potencias de dos en formato de cadena:

const char * const powers_of_two[] = {"1", "2", "4", "8", "16", "32", "64", ...}; 

Paso 2: Escribir una función que suma dos números en formato de cadena.

Paso 3: Iterate a través de los bits en tu número y agrega todas las cadenas correspondientes a los 1 bits.

Paso 4: Imprima el resultado.

Utilicé este enfoque para imprimir números de coma flotante muy grandes, y funcionó bien para mí.

+0

¡Muy listo, Fred! –

+2

Ni siquiera necesitas la tabla de potencias de 2: simplemente agrega el número a sí mismo para multiplicar por 2; agregue 1 al número si un bit es 1; repeat ==> profit – anatolyg

+0

Tenga en cuenta que solo funciona para números positivos, aunque eso se soluciona fácilmente. Brillante. –

2

Un algoritmo recursivo básica para dar salida a un número decimal:

void negate(Integer & number); // modifies the input 
int divide_by_10(Integer & number); // modifies the input 
bool is_zero(const Integer & number); 

void output_number(Integer number) 
{ 
    if (number.first < 0) 
    { 
     cout << "-"; 
     negate(number); 
    } 
    if (is_zero(number)) 
    { 
     cout << "0"; 
     return; 
    } 
    int remainder = divide_by_10(number); 
    if (!is_zero(number)) 
     output_number(number); 
    char digit[] = {'0', 0}; 
    digit[0] += remainder; 
    cout << digit; 
} 

He dejado las funciones de ayuda no definidas por ahora, tal vez esto es suficiente.

+0

Gracias. No tengo ninguna aritmética (quería poder ver el resultado primero), así que intentaré la sugerencia de @ Fred primero. Luego puedo comparar el rendimiento de ambos enfoques. – rubenvb

Cuestiones relacionadas