Problema con esercizio in C di numeri ripetuti

di Anonimizzato21939 il
13 risposte
Ciao a tutti,
ho un problema con un esercizio che chiede di fare un programma che dato un numero dica se ci sono numeri che compaioni più di una volta e gli stampi,ho provato in questo modo ma non mi esce,avete dei consigli su come farlo funzionare?
#include <stdio.h>
#include <math.h>
#define N 4

int n,i,M,n1;
int array [N];
int array2 [N];
int j;
int uguali=1;

int main(int argc, char const *argv[]) {

  M=N-1;

  printf("\nInserire il numero: ");
  scanf("%d", &n);
  n1=n;
  for (i=0;i<N;i++) {
    while (n1>9) {       /* CICLO WHILE PER TROVARE n-esima CIFRA */
      n1=n1/10;
    }
    array[i]=n1;
    n=n-n1*pow(10,M);
    M--;
    n1=n;
  }

  for (i=0;i<N;i++) {
    array2[i]=array[i];
  }

  for (i=0;i<N;i++) {                     /*RICERCA DEI NUMERI*/
    for (j=0;j<N;j++) {
      if (array[i]== array2[j]) {
        printf("\n\n%d\n\n", array[i]);
      }
    }
  }
  return 0;
}

13 Risposte

  • Capiamoci ... volevi dire

    "dato un numero dica se ci sono cifre che compaiono più di una volta e le stampi"

    ?

    E cosa succede ? Perché non (ri)esce ?
  • oregon ha scritto:


    Capiamoci ... volevi dire

    "dato un numero dica se ci sono cifre che compaiono più di una volta e le stampi"

    ?

    E cosa succede ? Perché non (ri)esce ?


    Allora l'utente dal terminale deve inserire un numero

    il programma deve stampare quali sono i numeri che vengono ripetuti più di una volta

    per es. se l'utente immette :24352 il programma dovrà stampare 2

    Il mio problema è che il programma stampa il numero 2 però seguito da un numero negativo che non ha un senso che appaia nella printf
  • Non ripetere l'errore ... tu parli di "numeri ripetuti" e invece sono "cifre ripetute".

    Tu hai previsto N 4 ovvero un numero con 4 cifre. Ma po utilizzi un numero come 24352 che ne ha 5 cifre e quindi hai un problema di overflow del buffer. Devi prevedere un buffer più grande.
  • oregon ha scritto:


    Non ripetere l'errore ... tu parli di "numeri ripetuti" e invece sono "cifre ripetute".

    Tu hai previsto N 4 ovvero un numero con 4 cifre. Ma po utilizzi un numero come 24352 che ne ha 5 cifre e quindi hai un problema di overflow del buffer. Devi prevedere un buffer più grande.
    No,non è quello il problema,anche se uso un numero di 4 cifre non funziona lo stesso
  • Se usi un numero di 4 cifre cosa succede esattamente? Hai altri valori negativi? Non credo.

    Comunque, fidati delle risposte, la grandezza del buffer è COMUNQUE un problema. Non l'unico ma il più grave.
  • oregon ha scritto:


    Se usi un numero di 4 cifre cosa succede esattamente? Hai altri valori negativi? Non credo.

    Comunque, fidati delle risposte, la grandezza del buffer è COMUNQUE un problema. Non l'unico ma il più grave.
    si,con 4 cifre ho ancora dei numeri negativi,la dimensione del buffer non è sicuramente il problema più grande
  • Con quale valore in input a 4 cifre?
  • oregon ha scritto:


    Con quale valore in input a 4 cifre?
    qualsiasi, ad es 2442 stampa solo tipo sei volte il 2 andando a capo
  • Veramente sono stampati dei 2 e dei 4 ma NON numeri negativi come mi avevi detto prima.
  • oregon ha scritto:


    Veramente sono stampati dei 2 e dei 4 ma NON numeri negativi come mi avevi detto prima.
    Ho riprovato adesso e hai ragione te, evididentmente per sbaglio avevo eseguito un altro programma che avevo fatto.
    Per caso sapresti dirmi perchè stampa tutti quei 2 ed 4 quando dovrebbe stampare solo un 2 e un 4?
  • Ecco vedi ... quindi il problema più grave era la dimensione del buffer (e non poteva essere diversamente).

    La seconda questione è nelle for
    
     for (i=0;i<N;i++) {                     /*RICERCA DEI NUMERI*/
        for (j=0;j<N;j++) {
          if (array[i]== array2[j]) {
            printf("\n\n%d\n\n", array[i]);
          }
        }
      }
    
    che confrontano ogni cifra con sé stessa. E' evidentemente un metodo sbagliato perché il primo 2 sarà confrontato con sé stesso oltre che con l'altro 2, all'andata e al ritorno ... e così per ogni cifra uguale ... e per questo avrai tutte quelle visualizzazioni ...

    Devi cambiare metodo, non usare un array2 copia di array ma usa un array che chiamerai cifre di 10 elementi tutti inizializzati a 0 all'avvio.
    E un solo ciclo for che aumenti ogni elemento quando trova la cifra corrispondente. Alla fine del ciclo avrai nel vettore cifre, per ogni cifra, quante volte si è presentata. Dovrai solo visualizzare le cifre che si sono presentate almeno 2 volte.
Devi accedere o registrarti per scrivere nel forum
13 risposte