Repository 32bit  Forum
Repository 64bit  Wiki

Numeri perfetti in C

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 18: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 20:18, modificato 1 volta in totale.
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 911
Iscritto il: mer apr 25, 2007 14:07
Località: Bari (Provincia)
Distribuzione: ArchLinux

Re: Numeri primi in C

Messaggioda SIV » sab ago 01, 2009 18: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: 911
Iscritto il: mer apr 25, 2007 14:07
Località: Bari (Provincia)
Distribuzione: ArchLinux

Re: Numeri primi in C

Messaggioda ccts2002 » sab ago 01, 2009 19: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: ven nov 10, 2006 0:20
Località: milano - trieste - catania

Re: Numeri primi in C

Messaggioda albatros » sab ago 01, 2009 20: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: 2050
Iscritto il: sab feb 04, 2006 14: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 18: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: 911
Iscritto il: mer apr 25, 2007 14:07
Località: Bari (Provincia)
Distribuzione: ArchLinux


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite