Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: [C] Divisori perfetti

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    35

    [C] Divisori perfetti

    Inanzitutto salve a tutti, sono uno studente del primo anno di informatica presso la Sapienza a Roma.
    Vi scrivo perchè sono in leggera difficoltà con l'esercizio

    Un intero positivo si dice perfetto se è uguale alla somma dei suoi divisori (sia primi che non primi) escluso se stesso. Per esempio 28 è perfetto perché 28 = 1+2+4+7+14. Scrivere una funzione int perfectNumbers(int n) che dato in input un intero positivo n restituisca il numero di numeri perfetti tra 1 e ed n.
    In particolare:

    Io ho scritto il codice:

    codice:
    #include<stdio.h>
    
    int perfectNumbers (int x){
    
        int pN=0;
    	int sommadivisori;
        int divisore=x-1;
    
    	while(x != 0){
    	 while (divisore != 0){
    	    if(x%divisore == 0) 		   sommadivisori+=divisore;
    	    divisore-=1;
    	}
    	 if (sommadivisori == x) pN+=1;
    	 x-=1;
    }
    	return pN;
    }

    Quello che succede però è che mi restituisce come valore sempre e solo pN = 1 o pN=0. Probabilmente l'errore è idiota perchè sono proprio agli inizi, ma vorrei capire dove ho sbagliato

    Grazie mille!

  2. #2
    Secondo me è sbagliato l'algoritmo matematico, e quindi anche il codice utilizzato. Per trovare i divisori devi ciclare da 1 fino al tuo numero x: usi l'operatore MOD tra questi 2 numeri e se il risultato è 0 significa che il numero è un divisore di x; ovviamente in tale caso fai la somma.


    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    35
    Originariamente inviato da MdE2005
    Secondo me è sbagliato l'algoritmo matematico, e quindi anche il codice utilizzato. Per trovare i divisori devi ciclare da 1 fino al tuo numero x: usi l'operatore MOD tra questi 2 numeri e se il risultato è 0 significa che il numero è un divisore di x; ovviamente in tale caso fai la somma.


    Ciao
    Guarda l'algoritmo funziona perchè se isolo quel ciclo while il suo lavoro lo fa

    Il problema comunque l'ho risolto, mi ero scordato di inizializzare le variabili prima del ciclo while più interno e quindi all'inizio del while esterno

    Grazie comunque dell'aiuto

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Come indicato nel Regolamento interno (punto 6), il codice va postato indentato all'interno degli appositi tag CODE.

    Correggo io il tuo post.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    piccolo appunto: il massimo divisore di un numero sarà al più la sua metà.
    ovviamente, con x = 100, il massimo divisore possibile è 50, non ha senso controllare anche per 51, 52, etc.

    secondo appunto: sommadivisori e divisore vanno inizializzati subito dentro il primo while

  6. #6
    Aggiungo che il metodo utilizzato è meno conveniente da un punto di vista prestazionale rispetto a quello da me indicato, e anche concettualmente più affine al problema stesso.


    Ciao

  7. #7
    Originariamente inviato da MdE2005
    Aggiungo che il metodo utilizzato è meno conveniente da un punto di vista prestazionale rispetto a quello da me indicato, e anche concettualmente più affine al problema stesso.


    Ciao
    fermandosi sempre a (x / 2) :wink:

  8. #8
    Originariamente inviato da google01
    fermandosi sempre a (x / 2) :wink:
    Ovviamente..volevo solo spiegare all'utente che in caso di elaborazione numerica o situazioni affini, è preferibile usare il ciclo for: nella fattispecie il tuo consiglio rappresenta un'ulteriore ottimizzazione.


    Ciao

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    35
    Grazie mille entrambi Vedrò di implementare l'algoritmo di MdE2005

  10. #10
    Originariamente inviato da cifa
    Grazie mille entrambi Vedrò di implementare l'algoritmo di MdE2005
    Perfetto..studio ed esercizio pratico sono i migliori metodi per imparare


    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.