PDA

View Full Version : [C] Divisori perfetti


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

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

int perfectNumbers (int x){

int divisore;
int pN=0;
int sommadivisori;

while(x != 0){
divisore=x-1;
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!

tuccio`
16-11-2010, 21:45
1) silvestri? :asd:
2) dovresti sempre inizializzare le variabili che usi, ad esempio non inizializzi sommadivisori, che dovresti mettere a 0 ogni volta che rientri nel ciclo while più esterno, probabilmente fixando questa cosa funzionerà
3) indenta meglio, è difficile leggere così :asd:

cifa
16-11-2010, 21:59
1) silvestri? :asd:
2) dovresti sempre inizializzare le variabili che usi, ad esempio non inizializzi sommadivisori, che dovresti mettere a 0 ogni volta che rientri nel ciclo while più esterno, probabilmente fixando questa cosa funzionerà
3) indenta meglio, è difficile leggere così :asd:

1) Nope, galesi D:
2) Eh, è che il mio prof non le inizializza sempre, mentre il mio libro la da come buona abitudine, quindi spesso mi confondo XD Pietà sono proprio nuovissimo del settore XD
3) Quello è frutto di copia e incolla infiniti :D

Ora ho inizializzato, ma non funziona :(

#include<stdio.h>

int perfectNumbers (int x){

int pN=0;
int sommadivisori=0;
int divisore=x-1;

while(x != 0){
sommadivisori=0;
while (divisore != 0){
if(x%divisore == 0)
sommadivisori+=divisore;
divisore-=1;
}
if (sommadivisori == x) pN+=1;
x-=1;
}
return pN;
}

tuccio`
16-11-2010, 22:11
piazza un

divisore = x/2;

dopo sommadivisori = 0; nel while e hai fatto ^_^

anche divisore deve essere reimpostato ogni volta che entri nel while

cifa
16-11-2010, 22:21
piazza un

divisore = x/2;

dopo sommadivisori = 0; nel while e hai fatto ^_^

anche divisore deve essere reimpostato ogni volta che entri nel while

Grazie mille funziona!

Mi spiegheresti però meglio a livello concettuale il perchè solo ora funziona ? E' una regola che così "a da esse" ? XD

Scusa se ti assillo, ma vorrei capire a fondo per evitare di risbagliare in futuro :D

(Mi dispiace anche fare domande stupide, ma essendo all'inizio vorrei avere tutte le basi chiarissime :) )

tuccio`
16-11-2010, 23:08
alla prima iterazione il divisore arriva a 0 per uscire dal ciclo while (divisore != 0).. non ne modifichi il valore e non rientra più in quel ciclo, perché la condizione del while è sempre falsa.. è chiaro che devi reimpostarlo a ogni iterazione

cifa
16-11-2010, 23:34
alla prima iterazione il divisore arriva a 0 per uscire dal ciclo while (divisore != 0).. non ne modifichi il valore e non rientra più in quel ciclo, perché la condizione del while è sempre falsa.. è chiaro che devi reimpostarlo a ogni iterazione

Certo, ci sono arrivato pochi secondi dopo aver scritto il post eheh

Comunque grazie mille, sei stato genitilissimo :)