PDA

Visualizza la versione completa : [C] Divisori perfetti


cifa
16-11-2010, 21:57
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:



#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 :D

Grazie mille!

MdE2005
16-11-2010, 23:53
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 :)

cifa
17-11-2010, 00:24
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 :D

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 :D

Grazie comunque dell'aiuto :)

LeleFT
17-11-2010, 09:55
Come indicato nel Regolamento interno (http://forum.html.it/forum/showthread.php?s=&threadid=973887) (punto 6), il codice va postato indentato all'interno degli appositi tag CODE.

Correggo io il tuo post.


Ciao. :ciauz:

google01
17-11-2010, 10:33
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

MdE2005
17-11-2010, 12:41
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 :)

google01
17-11-2010, 12:55
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:

MdE2005
17-11-2010, 13:21
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 :)

cifa
17-11-2010, 20:10
Grazie mille entrambi :) Vedrò di implementare l'algoritmo di MdE2005 :)

MdE2005
17-11-2010, 22:06
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 :)

Loading