|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Aug 2010
Messaggi: 3
|
[C] Esercizio cifre ripetute (errore in esecuzione)
Ciao a tutti.
Sto facendo un esercizio sugli array dove in input viene inserito un numero e stabilisce se il numero contiene cifre ripetute ed in caso affermativo quali. Compilando tutto ok, ma in esecuzione su alcuni numeri funziona bene su altri no. Esempio: n = 58585858 Ci sono 2 cifre ripetute: 5 8 n = 5858585858 Ci sono 3 cifre ripetute 1 5 6 io credo l'errore sia nel ciclo for ma non riesco a capire dove: Codice:
for(i--; i >= 0; i--){
for(j = i-1; j>=0; j--)
if( (numero[j] == numero[i]) && (numero[i] < 10) ){
numero[j] = 10; /*Per "eliminare" le cifre ripetute */
ripetuto = 1;
}
if(ripetuto){
cifre[cnt] = numero[i];
cnt++;
}
ripetuto = 0;
}
Spero di essermi spiegato bene e scommetto che il problema sarà dovuto ad una cavolata banale che non riesco a vedere |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Posta tutto il codice necessario a compilare.
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Aug 2010
Messaggi: 3
|
Ecco
Codice:
#include <stdio.h>
#define N 100
int main(void)
{
int d, cnt, i, j, ripetuto, numero[N];
cnt = 0;
ripetuto = 0;
printf("Inserisci un numero: ");
scanf("%d", &d);
/*inseriamo le cifre nell'array numero[N], l'array cifre sarà dichiarato dopo questo FOR
* per usare solo la memoria necessaria ed evitare sprechi */
for(i = 0; d != 0; i++){
numero[i] = d%10;
d /= 10;
}
int cifre[i/2]; /*caso peggiore*/
for(i--; i >= 0; i--){
for(j = i-1; j>=0; j--)
if((numero[j] == numero[i])&&(numero[i] < 10)){
numero[j] = 10; /*Per "eliminare" le cifre ripetute */
ripetuto = 1;
}
if(ripetuto){
cifre[cnt] = numero[i];
cnt++;
}
ripetuto = 0;
}
/*e così abbiamo svolto il programma.. ora stampiamo il tutto */
if(cnt>0){
printf("ci sono %d cifre ripetute: ", cnt);
for(i = 0; i < cnt; i++)
printf("%d ", cifre[i]);
}
else
printf("Non ci sono cifre ripetute!");
putchar('\n');
return 0;
}
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Ehm...
Codice:
int cifre[i/2]; /*caso peggiore*/
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Non capisco come possa compilargli una cosa simile...
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: May 2009
Messaggi: 186
|
Il numero in input viene letto come intero, quindi 5858585858 è troppo grande, non ci sta in 32 bit (suppongo tu stia usando un compilatore a 32 bit) e in d va a finire 1563618562. Ti bastavano 30 secondi di debug per vederlo. Se vuoi gestire numeri così grandi, ti consiglio di leggerli come stringa, tanto non ha senso fare la conversione, sempre caratteri ripetuti sono. In quel caso stai solo attento al controllo "numero[i] < 10".
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2007
Messaggi: 2267
|
Forse ti conviene prendere il numero in input come una stringa.
In questo modo non hai limiti di grandezza sul numero inserito ed inoltre le operazioni che tu vuoi fare risultano più semplici. Ti basterebbe ad esempio tenere un array ausiliario di 10 elementi e poi fare una cosa del genere: Codice:
...
char* numero = ... //dato in input
int n = ... //lunghezza della stringa che rappresenta il numero
int* aux = new int[10];
for(int i=0; i<10; i++)
aux[i]=0;
for(int i=0; i<n; i++)
aux[numero[i]]++;
//ora stampi i valori doppi
for(int i=0; i<10;i++){
if(aux(i)>1)
cout<<"numero "+i+" ripetuto "+aux[i]+" volte";
}
...
__________________
Concluso con:... |
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Aug 2010
Messaggi: 3
|
Il testo dell'esercizio richiedeva esplicitamente di usare scanf("%d", &n) quindi il limite dell'int è colpa dell'esercizio
Grazie ancora |
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
Quote:
Probabilmente, come ho detto prima, i VLA introdotti col C99 permettono questo, ma in casi del genere (cioè quando la dimensione non è nota durante la scrittura del codice) personalmente preferisco ricorrere all'allocazione dinamica.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:57.




















