View Full Version : [C] Cambio di base
Ciao a tutti........ :D
Sono di fronte a questo problema:
Scrivere un programma che dato in input un numero n in base 10 e un base b
maggiore o uguale di 2, converte n in base b.
Io avevo fatto una cosa del genere, però ho visto che non va:
#include <stdio.h>
int main(void){
int num,base,i=0,val=0;
printf("Inserisci numero: ");
scanf("%d", &num);
printf("Inserisci la base: ");
scanf("%d", &base);
for( ; num>0; num/=base, ++i)
if(num%base)
val+=pow(base,i);
printf("%d", val);
return 0;
}
Potete darmi qualche dritta??? Grazie :)
Il programma deve convertire secondo un alfabeto di cifre...ed il numero convertito non può che essere un vettore di interi (o al limiti sfruttando un alfabeto ongi intero può essere convertito in un carattere)...con ogni intero che rappresenta una cifra del numero convertito...
Ehm non ho capito molto :what:
Cioè l'algoritmo che ho usato io non va bene. A me interessa sapere anche quello, perché se devo convertire da base 10 a una base maggiore di 10 mi serve un certo algoritmo mentre se è minore me ne serve un altro.
Cioè l'algoritmo che ho usato io non va bene. A me interessa sapere anche quello, perché se devo convertire da base 10 a una base maggiore di 10 mi serve un certo algoritmo mentre se è minore me ne serve un altro.
No...serve sempre lo stesso algoritmo...
Le cifre che ottieni dalla conversione non puoi rimetterle in un intero... O te le stampi volta volta oppure le metti in un vettore di interi...
Il numero di cifre che servono per rappresentare un numero naturale N in base Beta è pari all'intero superiore di logaritmo in base Beta di N...
Quindi l'algoritmo che ho usato io va bene solamente che devo rappresentare ogni cifra nell' i-esima posizione di un vettore. Giusto?=
In generale il tuo algoritmo non va bene ;)
int exp = log(numero) / log(base);
int max = pow(base, exp);
while(max > 0)
{
cifra[exp] = numero / max;
numero %= max;
exp--;
max /= base;
}
Grazie ancora non vedo lo spoiler :) vorrei riuscirci da solo...
Ho provato a buttare giù questo:
#include <stdio.h>
#define N 32
int main(void){
int num,base,i;
int a[N]={0};
printf("Inserisci numero: ");
scanf("%d", &num);
printf("Inserisci la base: ");
scanf("%d", &base);
for(i=N; num>0, i>0; --i){
a[i]=num%base;
num/=base;
}
printf("La rappresentazione in base %d è: ", base);
for(i=0; i<N; ++i)
printf("%d", a[i]);
return 0;
}
Però non mi viene bene. Non è che ho sbagliato l'algoritmo? Eppure ho visto che l'algoritmo per convertire da base 10 a base N è che devo ripetutamente dividere il num per N e prendere i resti al contrario.
int a[N]={0};
Questo non azzera il vettore...
Si si ho provato personalmente. Non mettendo niente mi vengono tutti numeri strani. Se lo metto invece mi visualizza correttamente tutti 0. Anche sul mio libro c'è scritto che per azzerarlo si usa quell'istruzione. Il problema è un altro è che credo che non mi calcoli correttamente il valore nella base b.
Si si ho provato personalmente. Non mettendo niente mi vengono tutti numeri strani. Se lo metto invece mi visualizza correttamente tutti 0. Anche sul mio libro c'è scritto che per azzerarlo si usa quell'istruzione.
Strano, non mi torna molto... Che libro usi ?
Funziona, ma io suppongo che dipenda dall'implementazione del compilatore...
Ad esempio se scrivi:
int a[10] = {5};
non ti inizializza tutti gli elementi a 5, ma solo giustamente il primo. gli altri a 0...
C - Didattica e Programmazione di Al Kelley e Ira Pohl. COnforme allo standard ANSI C.
Ma perché pensi sia questo il problema?
Infatti dipende dal compilatore (per quanto riguarda gli array automatici come questo)
No, non penso che sia quello il problema, ma mi interessava questo aspetto...
Ma l'algoritmo che ho usato è giusto? A me sembra di si. Però se provo ad esempio a dargli come numero 13 e poi a dargli come base 2 mi da 110 :confused:
Aspetta...guardo meglio...
Prova con altre, ad esempio 1548 in base 16....
Ho provato ora mi viene 60
Questo perchè inizializzi i a N invece di N-1... Controlla ora...
E' vero ora tornano i risultati :)
E perché dovevo inizializzarlo a N-1 se devo partire dall'ultima posizione dell'array?
Perchè gli indici di un array di N elementi vanno da 0 a N-1...
Comunque riprova 1548 in base 16, che ti ricordo è 0x60C...
Ho capito grazie ;)
Il fatto è che devo mettere una condizione per dirgli che quando sta trattando la base 16 deve stampare il numero in notazione esadecimale, cioè anche con le lettere. Come faccio a dirgli questo?
Scordati di questo, ci pensi dopo ed è banale...l'algoritmo è sbagliato...
Dovrebbe fare male il calcolo per 1548...
1548 in base 16 mi viene 6012.
Ok perfetto torna...
Ora ti spiego come si fa a fare un alfabeto...
Ecco un indizio:
char alfabeto[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Con questo alfabeto potresti arrivare a base 62... Come fai a convertire ogni cifra ?
Ok però facendo riferimento a questo alfabeto devo cambiare tutto l'algoritmo.
Assolutamente no.. E' un passaggio talmente semplice che non ti immagini nemmeno...
Non riesco a capire come fare a dirgli che se numero%base è uguale a 10 allora devo prendere la A, se è uguale a 11 la B e così via.....
Prova a pensare cosa è 11 all'interno della stringa rispetto alla lettere B...
11 corrisponde alla posizione dove è B nell'array. Però questo non mi dice nulla. :what:
Tu cosa hai nel vettore di interi alla fine della conversione se 11 è l'indece di B ?
Alla fine della conversione devo avere B. Ma come faccio a farlo corrispondere....
Che ti viene in mente se ti scrivo alfabeto[a[i]] ?
Aaaah ecco. Embè che se po fa così? :D
Però il problema rimane perché a[i]=numero%base. Ma numero%base se viene ad esempio 0 come faccio a dirgli che deve prendere lo 0 dall'alfabeto?
Però il problema rimane perché io ho a[i]=numero%base, ma numero%base se viene ad esempio 0 come faccio a dirgli che deve prendere lo 0 dall'alfabeto?
P.S: Ho provato ad esempio a fare 1548 in base 16 e mi vengo tutti 48484848
Se a[i] = 0, alfabeto[a[i]] è '0'...
Metti il modificatore di stampa %c e togli %d...
Hai perfettamente ragione ora ho capito e funziona tutto ;)
Grazie mille per la tua disponibilità sempre molto gentile :)
Ciao.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.