Programma in linguaggio c
Ragazzi , avrei da realizzare un programmino in C tale che , dato un intero "n" di partenza ed un intero "x" , definisca quante volte la cifra x si ripeta nell'"n" di partenza .Io ho optato per
#include
#include
int main (void) {
int n , x , totale ;
scanf("%d",&n);
scanf("%d",&x);
totale=0;
for(n=n;n!=0;n=n/10){
if(n%10==x){
totale++;
}
}
printf( "%d ", totale);
system("PAUSE");
return 0;
}
Fino a 9 cifre tutto ok , ma da 10 in poi comincia a dar fuori numeri strani , come se optasse per starne congruenze . Sapreste aiutarmi ?
#include
#include
int main (void) {
int n , x , totale ;
scanf("%d",&n);
scanf("%d",&x);
totale=0;
for(n=n;n!=0;n=n/10){
if(n%10==x){
totale++;
}
}
printf( "%d ", totale);
system("PAUSE");
return 0;
}
Fino a 9 cifre tutto ok , ma da 10 in poi comincia a dar fuori numeri strani , come se optasse per starne congruenze . Sapreste aiutarmi ?
Risposte
Il problema è che non è possibile rappresentare un intero $n > 2^31 - 1 = 2147483647$ utilizzando int. Fino a 9 cifre, il numero è sicuramente minore del minimo, ma appena arrivi a 10 iniziano ad esserci dei numeri non rappresentabili e il risultato dipende da come sono state implementate le librerie nel tuo compilatore.
Prova a cambiare tipo ai numeri in questione. Considerali caratteri e tratta n come una stringa.
Oppure dichiarali usando long o unsigned, se è compatibile col tuo obiettivo.
unsigned o long non sono una soluzione al problema. Un tipo unsigned arriva a solo $2^{32} - 1$, che ha comunque lo stesso numero di cifre decimali del tipo signed. long in alcune piattaforme ha invece 32 bit come int (è cioè lo stesso tipo) e questo comportamento è conforme agli standard. Ma anche i tipi a $64$ non forniscono una soluzione comunque, perché sono anche loro limitati e prima o poi il calcolo è destinato a fallire. L'unica soluzione è quella di usare rappresentazioni formate da array di numeri, anche solo i char come consigliato da Anlem, che sono però eccessivamente complicate per qualcuno che non sa che gli int non possono rappresentare numeri arbitrariamente grandi.