PDA

Visualizza la versione completa : [C++] Programma per il calcolo dei numeri perfetti


flashare
20-10-2009, 20:40
Salve!
Ho realizzato per esercizio un programma che calcoli un numero prestabilito di numeri perfetti (numeri i cui divisori sommati danno il numero stesso).
Il codice è il seguente:



/*Programma per il calcolo di N numeri perfetti con N arbitrario*/

#include <stdio.h>

main()
{
/*Dichiarazione variabili*/
int n, i, k, cont, somma;

/*Lettura N*/
printf("Quanti numeri primi devo trovare?\n");
scanf("%d", &n);
i=0;

/*Ricerca numeri perfetti*/
cont=0;
k=0;
do {
i++;
somma = 0;
for(k=1; k <= i/2; k++) {
if((i % k) == 0)
somma += k;
}
if(somma == i){
printf("\n%d", &i);
cont++;
}
} while(cont <= n);
scanf("%d", &n);
return(0);
}


Tuttavia mi da come output semplicemente:
2293616
2293616
2293616

Dov'è l'errore? :dhò:

oregon
20-10-2009, 20:45
Scusa ... ma l'output corretto quale dovrebbe essere ?

flashare
20-10-2009, 20:51
A seconda del numero stabilito, una serie di numeri perfetti.
Se ad esempio si inserisce 10, dovrebbe restituire i primi 10 numeri perfetti.

shodan
20-10-2009, 21:00
Questi?
http://it.wikipedia.org/wiki/Numero_perfetto

Gasp! 54 cifre :dottò:

oregon
20-10-2009, 21:03
Ma chiedi quanti numeri "primi" devi trovare e poi vuoi i numeri "perfetti"?

A parte che, come ti e' stato fatto notare, non arriverai neanche al sesto numero ...

P.S. In ogni caso il problema dovrebbe essere in

printf("\n%d", &i);

che dovrebbe essere

printf("\n%d", i);

dato che non e' una scanf ...

flashare
20-10-2009, 21:13
Giusto! Grazie..
Per quanto riguarda il fatto dei numeri primi, ho sbagliato a scrivere xD

Comunque sia, era un esercizio dato, non conta quanti ne riesca a trovare ma che sia scritto correttamente..

ant_alt
21-10-2009, 01:05
sfruttando le proprietà note dei numeri perfetti è uscito questo

#include <stdio.h>
#include<math.h>
bool primo(int n) {
int b=2;
for(b = 2; b<=trunc(sqrt(n)); b++)
if(n%b == 0) {
return false;
}
return true;
}

int Pow(int x) {return (int)pow(2,(double)x);}

long Perfect(int n) {
if(primo(Pow(n+1)-1)==true) return Pow(n)*(Pow(n+1)-1);
return 0;
}
main()
{
int i=0,it=0,cont;
long num;
scanf("%d",&cont);

while(it<=cont){
i++;

if((num=Perfect(i))>0){it++;printf("%d\n",num);}
}
getchar();
getchar();
}


o la versione con la successione dell'OEIS (da wikipedia)


#include <stdio.h>
#include<math.h>
int Pow(int x) {return (int)pow(2,(double)x);}

long Perfect(int n) {
return Pow(n-1)*(Pow(n)-1);

}
int main(){
int i,n[]={2, 3, 5, 7, 13, 17, 19, 31, 61, 89};
for(i=0;i<6;i++)
printf("%d\n",Perfect(n[i]));

getchar();
}
ma ovviamente non vanno oltre il quinto numero, per come la vedo io questo è un altro esempio di esercizio dato da un prof la cui ignoranza è da denuncia

bitman
22-10-2009, 09:21
ma l'esercizio era ovviamente trovare un metodo di calcolo per i grandi numeri, non scrivere l'algoritmo :-D
http://www.codeproject.com/KB/cpp/largenumber.aspx
http://gmplib.org/

Loading