RISOLTO [C] Numeri perfetti da 1 a 1000

Pubblicità

gory10

Nuovo Utente
Messaggi
7
Reazioni
0
Punteggio
24
Salve a tutti,
ho problemi a completare questo semplice esercizio:
"Usate una funzione che determini tutti i numeri perfetti da 1 a 1000"
Questo è il codice della mia funzione :

C:
void perfectAll () {
    int x = 0;
    int sum = 0;
    printf("I numeri perfetti da 1 a 1000 sono: \n");
    for (int number = 1; number < 1000; number++) {
        for (int y = 1; y < number; y++) {
            x = number % y;
            if (x == 0) {
                sum += y;
                }  
        }
        if (sum == number)
            printf("%d \n", sum);          
    }
}
Quando lo eseguo non mi stampa nulla. In cosa sbaglio? Grazie in anticipo
 
Ultima modifica:
L'unico errore che vedo, che è poi causa dell'assenza della stampa, è che al termine del ciclo (dopo alla verifica di sum == number) non resetti sum.
--- i due messaggi sono stati uniti ---
Quindi in pratica:

C:
void perfectAll () {
    int x = 0;
    int sum = 0;
    printf("I numeri perfetti da 1 a 1000 sono: \n");
    for (int number = 1; number < 1000; number++) {
        for (int y = 1; y < number; y++) {
            x = number % y;
            if (x == 0) {
                sum += y;
                }   
        }
        
        if (sum == number)
            printf("%d \n", sum);     
            
        sum = 0;
    }
}
 
L'unico errore che vedo, che è poi causa dell'assenza della stampa, è che al termine del ciclo (dopo alla verifica di sum == number) non resetti sum.
--- i due messaggi sono stati uniti ---
Quindi in pratica:

C:
void perfectAll () {
    int x = 0;
    int sum = 0;
    printf("I numeri perfetti da 1 a 1000 sono: \n");
    for (int number = 1; number < 1000; number++) {
        for (int y = 1; y < number; y++) {
            x = number % y;
            if (x == 0) {
                sum += y;
                }  
        }
       
        if (sum == number)
            printf("%d \n", sum);    
           
        sum = 0;
    }
}
Grazie mille, ora stampa. Che errore banale. Però non capisco perché non mi stampava nulla, qualche valore anche sbagliato doveva stamparlo o no?
 
Grazie mille, ora stampa. Che errore banale. Però non capisco perché non mi stampava nulla, qualche valore anche sbagliato doveva stamparlo o no?

No, non poteva stampare in quanto sum non era mai uguale a number.
Con i numeri sino al 5, veniva incrementata di 1 a ogni ciclo (e con number=4, sono 2). Quando valutava il 6, da subito trovava il primo divisore, 1, e sum valeva quindi già 7.

È un ragionamento notturno dopo una giornata lavorativa, però mi sembra filare guardando il codice. :P
 
No, non poteva stampare in quanto sum non era mai uguale a number.
Con i numeri sino al 5, veniva incrementata di 1 a ogni ciclo (e con number=4, sono 2). Quando valutava il 6, da subito trovava il primo divisore, 1, e sum valeva quindi già 7.

È un ragionamento notturno dopo una giornata lavorativa, però mi sembra filare guardando il codice. :P
Giusto ! Grazie mille di nuovo :D
 
Potresti migliorare un bel po' l'efficienza: non c'è bisogno di testare tutti i divisori fino a number-1 al massimo fino alla radice quadrata intera
e tener conto che i divisori di un numero si dispongono a coppie intorno ad essa; per esempio se devi controllare il n. 100, il primo divisore che trovi è il 2 (da aggiungere alla somma) e quindi anche 100/2=50 è divisore e lo aggiungi alla somma. In questo modo farai una frazione molto piccola dei controlli che fai adesso. L'unico caso particolare da tenere in conto è che se il numero che controlli è un quadrato perfetto, i 2 fattori sono un unico divisore in quanto uguali. Esempio: se controlli 144, la radice è 12 e 12x12=144, per cui 12 è da aggiungere una sola volta alla somma; nota come per il 144 alla fine controlli solo gli interi da 2 a 12, mentre con il tuo algoritmo controlli tutti gli interi da 1 a 143.

Inoltre tieni conto che tutti inumeri perfetti conosciuti (in particolare quelli rappresentabili con i tipi interi primitivi dei linguaggi di programmazione) sono PARI, quindi puoi saltare il controllo sui numeri dispari: 777 non è perfetto in quanto dispari.
NOTA: non si sa ancora se esistano numeri perfetti dispari ma, se ci sono, hanno dimensioni enormi.
 
Pubblicità
Pubblicità
Indietro
Top