Repository 32bit  Forum
Repository 64bit  Wiki

Numeri perfetti in C

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

Numeri perfetti in C

Messaggioda SIV » sab ago 01, 2009 17:12

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) :| :|
Ultima modifica di SIV il sab ago 01, 2009 19:18, modificato 1 volta in totale.
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

Re: Numeri primi in C

Messaggioda SIV » sab ago 01, 2009 17:55

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;
}
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

Re: Numeri primi in C

Messaggioda ccts2002 » sab ago 01, 2009 18:50

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
Avatar utente
ccts2002
Linux 2.0
Linux 2.0
 
Messaggi: 155
Iscritto il: gio nov 09, 2006 23:20
Località: milano - trieste - catania

Re: Numeri primi in C

Messaggioda albatros » sab ago 01, 2009 19:19

SIV ha scritto:if (counter==number){printf("%d è un numero perfetto\n\n");}

Dovresti dire a printf quale variabile intera vuoi stampare...
Avatar utente
albatros
Iper Master
Iper Master
 
Messaggi: 2056
Iscritto il: sab feb 04, 2006 13:59
Località: 43°52' N 11°32' E
Slackware: current 64bit
Kernel: 3.8.4
Distribuzione: ubuntu 12.04

Re: Numeri primi in C

Messaggioda SIV » dom ago 02, 2009 17:18

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!
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)


Torna a Programmazione

Chi c’è in linea

Visitano il forum: TurnitinBot [Bot] e 3 ospiti