|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Sep 2007
Messaggi: 59
|
[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 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: 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 Grazie mille! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
1) silvestri?
![]() 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ì
|
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Sep 2007
Messaggi: 59
|
Quote:
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 Ora ho inizializzato, ma non funziona Codice:
#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;
}
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
piazza un
divisore = x/2; dopo sommadivisori = 0; nel while e hai fatto ^_^ anche divisore deve essere reimpostato ogni volta che entri nel while Ultima modifica di tuccio` : 16-11-2010 alle 22:13. |
|
|
|
|
|
#5 | |
|
Member
Iscritto dal: Sep 2007
Messaggi: 59
|
Quote:
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 (Mi dispiace anche fare domande stupide, ma essendo all'inizio vorrei avere tutte le basi chiarissime |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
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
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Sep 2007
Messaggi: 59
|
Quote:
Comunque grazie mille, sei stato genitilissimo |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:51.





















