Numeri perfetti

di il
8 risposte

Numeri perfetti

Salve, non capisco perché non mi funziona questo programma, l'obiettivo è individuare i numeri perfetti (la somma dei divisori di un determinato numero equivale al numero stesso), l'algoritmo mi sembra corretto, attraverso la trace table non ho notato problemi, ma l'output è totalmente errato, numeri che non capisco nemmeno sinceramente. Vi posto il codice, se qualcuno è interessato e vuole aiutarmi ne sarei lieto.
#include <stdio.h>
main () {
	int i=2,div,num=0,somma=0;
	while (i<1000) {
		for (div=2;div<=i;div++) {
		if (i%div==0) { 
		num=i/div;
		somma=somma+num;
		}
		if (somma==i)
		printf("%d ",somma);
		}
		i++;
	}
}
Penso che si debbano anche reimpostare a 0 le variabili num e somma dopo il ciclo for, ma in quel caso scompare del tutto l'output. Per quale motivo?

8 Risposte

  • Re: Numeri perfetti

    A prima vista, mi sa che la somma va azzerata nel ciclo subito dopo la while.
  • Re: Numeri perfetti

    
    #include <stdio.h>
    
    int main() {
    
      int numero, somma = 0;
    
      //input
      numero = 6;
    
      //intervallo divisori = [1,numero-1]
      for (int i = 1; i < numero; i++) {
        if (numero % i == 0) { //'i' è divisore di 'numero'?
          somma += i; //somma il divisore al totale
        }
      }
    
      //La somma dei divisori equivale al numero dato?
      if (somma == numero) {
        printf("%d è un numero perfetto\n", numero);
      } else {
        printf("%d non è un numero perfetto\n", numero);
      }
    
    }
    
    Ciao, io ho risolto così, spero ti aiuti a capire dove sbagliavi.
    Se hai qualche dubbio domanda pure
  • Re: Numeri perfetti

    ariston077 ha scritto:


    
    #include <stdio.h>
    
    int main() {
    
      int numero, somma = 0;
    
      //input
      numero = 6;
    
      //intervallo divisori = [1,numero-1]
      for (int i = 1; i < numero; i++) {
        if (numero % i == 0) { //'i' è divisore di 'numero'?
          somma += i; //somma il divisore al totale
        }
      }
    
      //La somma dei divisori equivale al numero dato?
      if (somma == numero) {
        printf("%d è un numero perfetto\n", numero);
      } else {
        printf("%d non è un numero perfetto\n", numero);
      }
    
    }
    
    Ciao, io ho risolto così, spero ti aiuti a capire dove sbagliavi.
    Se hai qualche dubbio domanda pure
    Grazie dell'aiuto. Questo metodo può funzionare se, ad esempio, si chiede all'utente d'inserire un numero per verificare se sia perfetto o meno, ma non li stampa tutti automaticamente. Penso che sia necessario un ciclo per la condizione principale, ovvero l'incremento della variabile che contiene il numero.
  • Re: Numeri perfetti

    Ho presupposto che l'output dovesse essere comunicare all'utente se il numero inserito fosse perfetto o meno, errore mio, scusa. Ma comunque non credo di aver capito che output deve produrre il programma, cosa intendi con
    non li stampa tutti automaticamente
    ?
  • Re: Numeri perfetti

    ariston077 ha scritto:


    Ho presupposto che l'output dovesse essere comunicare all'utente se il numero inserito fosse perfetto o meno, errore mio, scusa. Ma comunque non credo di aver capito che output deve produrre il programma, cosa intendi con
    non li stampa tutti automaticamente
    ?
    Intendo che l'output dovrebbe essere costituito dai numeri perfetti: 6,28,496 ecc, non dal singolo numero per il quale si verifica se sia perfetto o meno.
  • Re: Numeri perfetti

    Scusa, non avevo capito la necessità di testare una serie di numeri. Ad ogni modo è sufficiente inerire il codice in un ciclo che incrementi la variabile numero e ritoccare le istruzioni di output.
    
    #include <stdio.h>
    
    int main() {
    
      int numero = 0, somma = 0;
    
      while (numero < 1000) {
        //intervallo divisori = [1,numero-1]
        for (int i = 1; i < numero; i++) {
          if (numero % i == 0) { //'i' è divisore di 'numero'?
            somma += i; //somma il divisore al totale
          }
        }
        
        //La somma dei divisori equivale al numero dato?
        if (somma == numero) {
          printf("%d\n", numero);
        }
        
        numero++;
    }
    
    
  • Re: Numeri perfetti

    ariston077 ha scritto:


    Scusa, non avevo capito la necessità di testare una serie di numeri. Ad ogni modo è sufficiente inerire il codice in un ciclo che incrementi la variabile numero e ritoccare le istruzioni di output.
    
    #include <stdio.h>
    
    int main() {
    
      int numero = 0, somma = 0;
    
      while (numero < 1000) {
        //intervallo divisori = [1,numero-1]
        for (int i = 1; i < numero; i++) {
          if (numero % i == 0) { //'i' è divisore di 'numero'?
            somma += i; //somma il divisore al totale
          }
        }
        
        //La somma dei divisori equivale al numero dato?
        if (somma == numero) {
          printf("%d\n", numero);
        }
        
        numero++;
    }
    
    
    Questo è ciò che credevo si dovesse fare, ma non funziona. Non so se tu abbia già provato il codice, l'output è un elenco di 0 perché numero dev'essere almeno con valore superiore o uguale a 1. Peccato che anche modificando il suo valore i problemi restano: scompare l'output, c'è solo il cursore.
  • Re: Numeri perfetti

    Effettivamente non avevo provato il codice, infatti ho fatto un errore dimenticandomi di azzerare la variabile somma alla fine del ciclo while.
    
    #include <stdio.h>
    
    int main() {
    
      int numero = 0, somma = 0;
    
      while (numero < 1000) 
      
        //intervallo divisori = [1,numero-1]
        for (int i = 1; i < numero; i++) {
          if (numero % i == 0) { //'i' è divisore di 'numero'?
            somma += i; //somma il divisore al totale
          }
        }
    
        //La somma dei divisori equivale al numero dato?
        if (somma == numero) {
          printf("%d\n", numero);
        }
    
        somma = 0;
        numero++;
      }
    }
    
Devi accedere o registrarti per scrivere nel forum
8 risposte