2010-08-23 3 views
5

Esiste un algoritmo efficiente per la conversione tra sistema numerico quando la dimensione integer sorgente è arbitraria?algoritmo efficiente per la conversione tra sistema numerale

Ad esempio, si supponga che v'è un array intero {1, 4, 8} che è 148 in formato decimale come input. Potrebbe essere convertito in {9, 4} in formato esadecimale o {2, 2, 4} in ottale o {1, 0, 0, 1, 0, 1, 0, 0} in formato binario, o solo { 148} nel formato 1234-ary o qualcosa del genere.

È semplice quando il valore effettivo può essere espresso in word-size supportato dalla macchina. Ma quando si passa a dimensioni arbitrarie, non riesco a trovare un modo efficiente migliore di O (n^2).

+0

Dovrebbe essere possibile in O (n). Potresti voler (anche) provare su math.stackexchange.com. –

risposta

3

Dividere per la base, spingere indietro il modulo, sciacquare e ripetere, mentre il quoziente! = 0.

Così, ad esempio convertire 148 nella base di 16

148/16 = 9 r 4 
    9/16 = 0 r 9 

Così, 148 in esadecimale è 0x94 . Questo non dovrebbe richiedere così tanto tempo.

+0

Sfortunatamente, non è così semplice quando un numero è abbastanza grande - pensate a 10^100, che non può essere rappresentato in 1 intero atomico nell'architettura attuale del computer. – summerlight

+0

Ovviamente, può essere usata qualche astrazione come la classe big_int, ma peggiora il problema, dal momento che la complessità temporale di un'operazione modulare e di divisione è O (n^2) e abbiamo bisogno di O (n) operazione modulare e di divisione per un conversione. – summerlight