PDA

Visualizza la versione completa : [C] conversione numeri


losker
26-03-2010, 16:43
Ciao

ho un problema riscontrato durante lo sviluppo di una mia applicazione

e cioè di convertire un numero da base 10 a base diversa da 10 e viceversa

il mio obiettivo è di creare un codice più breve possibile.. non mi interessa la performance la pesantezza o la pulizia del codice

ho trovato la funzione itoa (che non è standard C, ma assolve il compito in modo veloce con una sola istruzione)


int main() {
char bin[25];
int n;
scanf("%d",&n);
bin=itoa(n, bin, 2);
return 0;
}

in questo caso converto da decimale a binario
ma è un attimo convertire a base diversa


come posso effettuare la conversione da base diversa da 10 a base 10
non ho capito come funziona atoi..

LeleFT
26-03-2010, 17:40
Non vedo come possa esserti utile la funzione atoi che, se non ricordo male, converte una stringa in numero. Può essere che abbia anche una sorta di conversione interna, ma se così è non la conosco a sufficienza.

Per convertire un numero da base qualunque (minore di 10) a base 10 è sufficiente usare un po' di matematica.

Prova a vedere questa funzione e cerca di capirne la logica (la funzione non è delle migliori, l'ho scritta al volo):



int converti_base_to_10(int base, int x) {
int ret = 0;
int temp = 0;

if (x < base) return x;
temp = converti_base_to_10(base, x / 10);
ret = base * temp + (x % 10);

return ret;
}


Il primo parametro è la base del numero da convertire, il secondo parametro è il numero da convertire in base 10. Esempio:



// Converte il valore 500 espresso in base 8 nel relativo valore in base 10
int convertito = converti_base_to_10(8, 500);


Per basi superiori alla 10 non è possibile usare questa funzione (per ovvie ragioni).


Ciao. :ciauz:

LeleFT
26-03-2010, 17:48
Originariamente inviato da losker
il mio obiettivo è di creare un codice più breve possibile.. non mi interessa la performance la pesantezza o la pulizia del codice


A tal proposito, la funzione di prima la puoi riscrivere così:



int converti_base_to_10(int base, int x) {
return (x < base) ? x : converti_base_to_10(base, x / 10) * base + (x % 10);
}


Ciao. :ciauz:

losker
29-03-2010, 17:18
grazie mille!

un suggerimento per modificare la tua funzione e fare in modo che sia possibile convertire numeri fino a base 16

Grazie :)

LeleFT
29-03-2010, 18:20
Originariamente inviato da losker
grazie mille!

un suggerimento per modificare la tua funzione e fare in modo che sia possibile convertire numeri fino a base 16

Grazie :)

Dovresti controllare il simbolo che stai "parsando".
Se è una lettera compresa fra A e F (compresi), consideri il relativo valore decimale (10-15).
Ovviamente, il tipo accettato come parametro non potrà più essere un intero, ma dovrà, obbligatoriamente, essere una stringa.

Ciao. :ciauz:

Loading