2012-06-14 19 views
5

Che cos'è un algoritmo scalabile per stampare un numero intero N-binario manualmente il cui valore non si adatta a long long. So printf e amici, insieme a <iostream> (che molto probabilmente piggy-back su <cstdio> hanno questo integrato per i tipi standard, ma mi piacerebbe farlo per un intero composto da N byte.stampa manuale di un intero N-byte

ho pensato a questo e googled un po ', ma si tratta sempre di usare un bigint libirario preesistente come GMP (un codebase che non conosco affatto) o "use printf" o il più utile "questo è difficile"

il numero intero è fondamentalmente:

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

così reinterpretando byte un Integer<4> 's w Potresti prenderti un int32_t. Mi piacerebbe ridimensionarlo a N> 8. L'efficienza non è davvero la mia preoccupazione al momento. Né è endianness (questo è per x86).

+2

Io lo prendo è necessario stampare il numero in decimale? – NPE

+0

@aix yes decimal sarebbe l'idea. – rubenvb

+0

Il mio consiglio sarebbe di usare comunque una libreria bigint; quelle librerie sono debuggate e provate. Come troverai difetti nella tua codifica? Non è come se si verificassero i risultati con carta e penna o in Excel. – tomdemuyt

risposta

5

Fase 1: Definire una tabella di ricerca che contiene potenze di due in formato stringa:

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

Fase 2: Scrivere una funzione che aggiunge due numeri in formato stringa.

Passaggio 3: scorrere i bit nel proprio numero e aggiungere tutte le stringhe corrispondenti ai 1 bit.

Passaggio 4: stampa il risultato.

Ho usato questo approccio io stesso per la stampa di numeri in virgola mobile molto grandi, e ha funzionato bene per me.

+0

Fred molto intelligente! –

+2

Non hai nemmeno bisogno della tabella dei poteri di 2: basta aggiungere il numero a se stesso per moltiplicare per 2; aggiungi 1 al numero se un bit è 1; repeat ==> profit – anatolyg

+0

Si noti che funziona solo con numeri positivi, sebbene sia facilmente risolvibile. Brillante. –

2

Un algoritmo ricorsivo di base per l'emissione di un numero decimale:

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

ho lasciato le funzioni di supporto non definito per ora, forse questo è sufficiente.

+0

Grazie. Non ho alcuna aritmetica (volevo essere in grado di vedere prima il risultato), quindi proverò prima il suggerimento di Fred. Posso in seguito confrontare le prestazioni di entrambi gli approcci. – rubenvb