Cambi di base

zavo91
sono sempre qua a tribulare con esercizi di C. Questa volta ho un esercizio che dice:
Scrivere una funzione f che, dato un numero n,calcoli se la somma delle sue cifre, quando è rappresentato in base 5, è pari oppure dispari(la funzione ritorni 0 se la somma è pari,1 se la somma è dispari)
Esempio f(10) siccome 10 i base 5 è 20 la somma delle cifre è 2,che è pari la funzione deve resituire 0,
f(7) siccome 7 n base 5 è 12 la somma è 3 la funzione deve restituire 1
Questo è quello che ho scritto io ma che funziona solo con alcuni numeri tipo f(6)non mi funziona e deve ritornare 0 perchè 6 in base 5 è 11 la somma è 2 che è pari a me ritorna 1!

#include<stdio.h>
int f(int n)
{
 	int s=0;
	int r=0;
	while(n>0)
	{
		n=n/5;
		r=n%5;
		s=s+r;
	}
	if(s%2==0) return 0;
	return 1;
}
int main()
{
	printf("%i\n",f(6));
}


dove ho sbagliato che secondo me è giusto come logica??

Risposte
apatriarca
Facendo prima la divisione del calcolo del resto perdi una cifra. Se infatti prendiamo il numero 6, dividi per prima cosa il numero per 5 ottenendo 1, poi ne calcolo il resto della divisione per 5 ottenendo sempre 1 e quindi esci dal ciclo. La divisione per la base deve essere l'ultima operazione del ciclo, non la prima.

EDIT: quando hai qualcosa del tipo
if (condizione) return 0;
else return 1;

tanto vale scrivere semplicemente
return !(condizione);

I due codici sono infatti equivalenti. Il valore restituito non deve per forza venire da una costante o da una variabile, può anche essere calcolato a partire da una espressione più complicata. Nel tuo caso puoi quindi scrivere
return !(s % 2 == 0);

o ancora meglio, osservando che il valore del confronto è uguale al valore a sinistra dell'==:
return s % 2;


EDIT 2: In realtà non è del tutto vero quello che ho scritto alla fine dell'EDIT. Mi sono infatti reso conto che ad esempio -9 % 2 == -1. La penultima versione, anche se più complicata è quindi da preferire se si vogliono accettare anche i numeri negativi. Ma in questo caso non funziona neanche il calcolo delle cifre che andrebbe forse riadattato (potrebbe in realtà funzionare lo stesso perché credo che la proprietà di una cifra di essere pari o dispari sia preservata e quindi il risultato corretto potrebbe valere comunque).

zavo91
"apatriarca":
Facendo prima la divisione del calcolo del resto perdi una cifra. Se infatti prendiamo il numero 6, dividi per prima cosa il numero per 5 ottenendo 1, poi ne calcolo il resto della divisione per 5 ottenendo sempre 1 e quindi esci dal ciclo. La divisione per la base deve essere l'ultima operazione del ciclo, non la prima.


wow non la sapevo questa cosa non ci avevo neanche pensato e non mi era neanche venuto in mente...siete ottimi...comunque il mi omodo di scrivere
if (condizione) return 0;
else return 1;


non è sbagliato vero??

te hai voluto solo farmi vedere un codice più pulito e corto vero?

apatriarca
Sì.. non è un errore.

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