Esercizio in C

zavo91
Ciao a tutti vi propongo un esercizio che non riesco a risolvere il testo dice : implementare una funzione in modo che ricevuti in ingresso due numeri interi n e b ritorni il numero di cifre diverse che che sono presenti nella rappresentazione di n in b.

io ho fatto così:
#include <stdio.h>
#include <stdlib.h>
int memoria(int n, int b)
{
   int count=0;
   while(n>0)
   {
      n=n/b;
      count++;
   }
   return count;
}


int* converti(int n, int b)
{	int j;
	int z;
	int cont=0;
	int *v = (int*) malloc(sizeof(int)*memoria(n,b));
    	int resto=0;
   	int i=memoria(n,b)-1;
   	while(n>0)
   	{
      		resto=n%b;
      		n=n/b;
     		v[i]=resto;
      		i--;
   	}
   		return v;
// avevo tentano una funzione per le cifre diverse ma non funziona :)
	[b]/*for(j=0;j<=v[i];j++)
	{
		for(z=0;z<=v[i];z++)
		if(v[j]!=v[z])
		cont++;
	}
		return cont;*/
}[/b]


int main()
{
   int x=10;
   int b=2;
   int* y=converti(x,b);
   int i=0;
   while (i<memoria(x,b))
   {
      printf("%d\n",y[i]);
      i++;
   }
}


io ho fatto la rappresentazione di n in base b e gliela faccio stampare a video con un array dinamico con la malloc...il programma funziona con i numeri passati nel codice come parametri. non riesco ad implementare la funzione che trova le cifre diverse. e vorrei implementare anche una funzione che converta tutti i numeri che voglio con le basi che voglio e non solo con quei due passati come parametri nel codice. grazie a tutti per l'aiuto.

Risposte
hamming_burst
Ciao,
ti prego utilizza i tag [code], un codice non indentato è una cosa immonda :)

per questo:
"zavo91":
e vorrei implementare anche una funzione che converta tutti i numeri che voglio con le basi che voglio e non solo con quei due passati come parametri nel codice. grazie a tutti per l'aiuto.


basta che vai di divisioni successive ed utilizzi il resto.

zavo91
"hamming_burst":
Ciao,
ti prego utilizza i tag [code], un codice non indentato è una cosa immonda :)

per questo:
[quote="zavo91"] e vorrei implementare anche una funzione che converta tutti i numeri che voglio con le basi che voglio e non solo con quei due passati come parametri nel codice. grazie a tutti per l'aiuto.


basta che vai di divisioni successive ed utilizzi il resto.[/quote]
Si ok come ho fatto io e aggiungo delle scanf ma mi riferivo al fatto che ho messo un pò di puntatori e non vorrei fare casino con la memoria a

apatriarca
Spiegheresti meglio il tuo problema? In che senso hai paura di aver fatto un casino con la memoria?

Io utilizzerei comunque un approccio diverso. Invece di memorizzare l'intera rappresentazione del numero in base \(b\), creerei un array di lunghezza \(b\) di interi inizializzati a 0. A questo punto fai il ciclo per calcolare le cifre e incrementi gli elementi dell'array di lunghezza \(b\) con indice uguale alle cifre che man mano escono. Se l'elemento da incrementare era ancora uguale a zero hai allora trovato una nuova cifra distinta dalle altre e puoi incrementare un contatore. In questo modo ti eviti di dover calcolare due volte le cifre del numero.

zavo91
"apatriarca":
Spiegheresti meglio il tuo problema? In che senso hai paura di aver fatto un casino con la memoria?


nel senso che con tutti i puntatori che ho usato mi è capitato che uscisse quando compilavo con gcc errore di segmentazione :)

Invece di memorizzare l'intera rappresentazione del numero in base \(b\), creerei un array di lunghezza \(b\) di interi inizializzati a 0. A questo punto fai il ciclo per calcolare le cifre e incrementi gli elementi dell'array di lunghezza \(b\) con indice uguale alle cifre che man mano escono. Se l'elemento da incrementare era ancora uguale a zero hai allora trovato una nuova cifra distinta dalle altre e puoi incrementare un contatore. In questo modo ti eviti di dover calcolare due volte le cifre del numero.


ma come faccio a creare un array di lunghezza b?? io volevo creare un array dinamico che cambia lunhezza in base al numero che inserisce l'utente da console.

apatriarca
Per creare un array di interi di lunghezza \(b\) è sufficiente allocarlo dinamicamente in modo del tutto simile a quello che hai fatto nel tuo codice per creare l'array che contiene la rappresentazione di \(n\) nella base \(b\).
int *counters = malloc(sizeof(int)*b);

Se \(b\) fosse costante o esistesse un valore massimo, sarebbe ovviamente possibile allocarlo staticamente con questa dimensione massima.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.