Pagina 1 di 1

Numeri perfetti in C

Inviato: sab 1 ago 2009, 18:12
da SIV
Ragazzi vi allego la traccia del vecchio Deitel:
Un numero intero è detto perfetto quando la somma dei suoi fattori, incluso 1 (ma non se stesso), sia pari a quel numero.
Per esempio 6 è un numero perfetto perchè 6= 1+2+3.
Scrivete una funzione perfect che determini se il parametro number sia un numero perfetto. Utilizzate questa funzione in un programma che determini tutti i numeri perfetti tra 1 e 1000.
Visualizzate i fattori di ogni numero perfetto, per confermare che lo sia veramente.
Non so come calcolare i fattori di un numero dato (n) :| :|

Re: Numeri primi in C

Inviato: sab 1 ago 2009, 18:55
da SIV
Ho trovato un paper inglese dove che dato un numero mostra i fattori primi -> paper

L'ho modificato in modo da tenere traccia (counter) della somma dei fattori e confrontarlo con il numero stesso, ma non funge, nessun errore fatale, ma il programma si avvia ma non mostra nessun output, non terminando tra le altre cose:

Codice: Seleziona tutto

#include <stdio.h>

int main(void)
{
unsigned int number=0,k=0,factor,counter;

while (k<10) {
number=k;
while (number % 2 == 0) {
number=number/2;
counter+=2;
}

for (factor=2; factor*factor <= number; factor=factor+2)
if (number % factor == 0) {
number=number/factor;
counter+=factor;
}


if (counter==number){printf("%d è un numero perfetto\n\n");}
}
return 0;
}

Re: Numeri primi in C

Inviato: sab 1 ago 2009, 19:50
da ccts2002
mi è sembrato di vedere almeno un errore...
nella parte:

Codice: Seleziona tutto

while (k<10) {
number=k;
while (number % 2 == 0) {
number=number/2;
counter+=2;
}
tu entri con k=0, poni number=k, number diviso 2 ha resto uguale a 0, entri quindi nel while che pone number=number/2 (cioè number=0/2=0) e quindi il ciclo diventa infinito...e il programma non terminerà mai!
un modo per calcolare i divisori (per fare in maniera semplice e sporca) è dividere il numero per tutti i numeri minori della metà del numero e controllare il resto:

Codice: Seleziona tutto

#include <stdio.h>

int perfect(int a)
{
int i,tmp=1;
 for ( i = 2 ; i <= a/2 ; i++){
  if( a % i == 0 ) {
   tmp += i;
// stampa il divisore
   printf("%d ",i);
  } else continue;
 }
 printf("\n");
// controlla se è perfetto
 if (tmp == a) return 1;
 else return 0;
}

int main ()
{
 printf("%d\n",perfect(6));
 printf("%d\n",perfect(7));
 printf("%d\n",perfect(24));
 printf("%d\n",perfect(28));
 printf("%d\n",perfect(25));
 printf("%d\n",perfect(33550336));

 getchar();
}

ciao
P.S.: cambia il titolo in "numeri perfetti in C" :D

Re: Numeri primi in C

Inviato: sab 1 ago 2009, 20:19
da albatros
SIV ha scritto:if (counter==number){printf("%d è un numero perfetto\n\n");}
Dovresti dire a printf quale variabile intera vuoi stampare...

Re: Numeri primi in C

Inviato: dom 2 ago 2009, 18:18
da SIV
albatros ha scritto:
SIV ha scritto:if (counter==number){printf("%d è un numero perfetto\n\n");}
Dovresti dire a printf quale variabile intera vuoi stampare...
Vorrei spararmi per questo :D , comunque il source era sballato completamente.


@ccts2002

Grazie mille, tralasciando la questione matematica di dividere il numero per tutti i numeri minori della sua metà, il source funziona. Ho fatto in modo di metterlo in un ciclo for di 1000 volte, per calcolare i primi numeri perfetti fino a 1000.
Sono riuscito a fare in modo di stampare a video solo i numeri primi, però non sono riuscito a fare:

Codice: Seleziona tutto

quando è appurato che il numero è perfetto, visualizzare anche i suoi fattori
Poichè nel source di ccts2002, i fattori venivano stampati sempre, ho dovuto commentare la riga, ecco il source che è quasi a conclusione :thumbright:

Codice: Seleziona tutto

#include <stdio.h>

int perfect(int a)
{
int i,tmp=1;
for ( i = 2 ; i <= a/2 ; i++){
  if( a % i == 0 ) {
   tmp += i;
   //printf("%d+",i);
  } else continue;
}

if (tmp == a)
return 1;

else return 0;
}

int main ()
{
int j,ris;
for ( j = 2 ; j <= 1000 ; j++){
ris = perfect(j);
if (ris==1){printf("Il numero %d è perfetto!\n",j);}
}
return 0;
}
Ed ecco l'output:

Codice: Seleziona tutto

muller@sab-muller ~/Test C $ ./a.out
Il numero 6 è perfetto!
Il numero 28 è perfetto!
Il numero 496 è perfetto!