[C] Numeri perfetti

di il
12 risposte

[C] Numeri perfetti

Ciao a tutti, sto tentando di scrivere un programma che riconosce se un numero inserito dall'utente è perfetto.
Un numero è perfetto se è uguale alla somma dei suoi fattori (non necessariamente primi), comprendendo 1 ma non il numero stesso.
Per esempio 6 = 3+2+1 (3, 2, 1 sono i fattori di 6) -> 6 è perfetto.
28 = 14+7+4+2+1 (14, 7, 4, 2, 1 sono i fattori non primi di 28) -> 28 è perfetto.

Ho scritto il seguente codice (C) ma non funziona e mi piacerebbe capire perché.
Se avete voglia


#include <stdio.h>
#include <stdlib.h>

int main()
{
int num, i, somma=0, fatt;

printf("Inserisci il numero.\n");
scanf("%d", &num);

for(i=2; i<=num; i++)
{
if((num % i)==0);
{
fatt=num/i;
somma = somma + fatt;
}
}

if(somma == num)
printf("Il numero e' perfetto\n");

else
printf("Il numero non e' perfetto.\n");

return 0;
}

Grazie

12 Risposte

  • Re: [C] Numeri perfetti

    Salve

    Non devi scrivere così:
    
    if((num % i)==0);
    
    Ma così:
    
    if((num % i)==0)
    
  • Re: [C] Numeri perfetti

    Inoltre era sbagliato anche l'algoritmo. Questo dovrebbe essere corretto:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int num, i, somma=0;
    
    	printf("Inserisci il numero: \n");
    	scanf("%d", &num);
    
    	for(i=1; i<num; i++)
    	{
    		if((num % i)==0)
    		{
    			somma = somma + i;
    		}
    	}
    
    	if(somma == num)
    		printf("Il numero e' perfetto\n");
    
    	else
    		printf("Il numero non e' perfetto.\n");
    
    	return 0;
    }
    
    
    Guarda bene le differenze, poi ci fai sapere se è tutto chiaro.

    Ciao.
  • Re: [C] Numeri perfetti

    Ciao
    Intanto grazie.
    Il ; dopo l'if è finito lì per sbaglio, scusami

    Per quanto riguarda l'algoritmo, penso di aver capito come funziona il tuo ma non mi è ancora chiaro perché il mio non funziona .

    Se prendo, per esempio, 6, dovrei avere, ripercorrendo quello che fa il programma (1), 2) ecc sono i "giri" del for)

    num = 6;

    1) i=2; 2<=6
    6 % 2==0
    fatt = 3 (6/2)
    somma = 0+3

    2) i=3 3<=6
    6 % 3==o
    fatt = 2 (6/3)
    somma = 3+2

    3) i=4 4<=6
    6 % 3 != 0 -> salta il resto

    4) i=5 5<=6
    6 % 4 != 0 -> salta il resto

    5) i=6 i<=6
    6 % 6 ==0
    fatt = 1 (6/6)
    somma = 5+1

    6) i=7 7>6 -> esce dal for

    Quindi all'uscita dal for dovrei avere
    somma == 6
    -> somma == num
    e quindi dovrebbe essere verificata la condizione del primo if e il programma dovrebbe stampare "Il numero e' perfetto".

    Dove sbaglio?
  • Re: [C] Numeri perfetti

    A me togliendo il ; il programma funziona.

    minomic ha scritto:


    Inoltre era sbagliato anche l'algoritmo. Questo dovrebbe essere corretto:
    Non è sbagliato, ottiene semplicemente i divisori in ordine decrescente.
  • Re: [C] Numeri perfetti

    Si in effetti non l'avevo letto bene. Ero partito direttamente con la mia idea.
  • Re: [C] Numeri perfetti

    Wolt ha scritto:


    A me togliendo il ; il programma funziona.
    Mi manderesti il codice che usi per favore?
  • Re: [C] Numeri perfetti

    Uso il tuo codice senza ;
  • Re: [C] Numeri perfetti

    Se segui questo genere di problemi ti consiglio di iscriverti a projecteuler che ti porta a risolvere problemi progressivamente sempre più difficili; il tuo problema è al numero 23 Buon divertimento
  • Re: [C] Numeri perfetti

    Io ho fatto così però non so se la fattorizzazione del numero che metto in input sia perfetta me lo potreste controllare?
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    int n,r,i,d4,d5,d=0,r2,r3;
    float d3;

    int main(int argc, char *argv[])
    {
    do
    {
    printf("Inserire il numero da controllare se sia perfetto >> ");
    scanf("%d", &n);
    }while(n<0);
    r=n%2;
    if(r==0)
    { d5=n/2;
    printf("I suoi divisori sono:\n");
    for(i=0;i<d5;i++)
    {
    d=d+i;
    printf("%d\n",d);
    }
    printf("\nIl numero %d e' perfetto",n);

    }else{
    d4=n/3;
    r2=n%3;
    if(r2==0)
    { printf("I suoi divisori sono:\n");
    for(i=0;i<d4;i++)
    {
    d=d+i;
    printf("%d\n",d);
    }
    printf("\nIl numero %d e' perfetto",n);

    }else{
    printf("\nIl numero %d non e' perfetto",n);
    }
    }

    return 0;
    }
  • Re: [C] Numeri perfetti

    Non si posta in thread di 5 anni fa!
  • Re: [C] Numeri perfetti

    Credo (stasera verifico) che si possa fare anche meglio:
    Aggiungi la marh.h, cje contiene la funzione squr(num) per avere pa radice quadrata del numero num. Poi ti basta fare un for da 1 (o meglio da 2, tanto 1 vale sempre) alla radice quadrata del numero (approssimata a intero). Ogni volta che trovi un divisore "conti" come dovisore sia esso che il risultato della divisione. Dovrebbe funzionare
    Quello che é certo é cje ti basta raggiungere laetà del numero
  • Re: [C] Numeri perfetti

    Silente... hai capito che non ha senso continuare in questo thread ?
Devi accedere o registrarti per scrivere nel forum
12 risposte