Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 20 su 20

Discussione: [C] Fattori

  1. #11
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da maiosyet
    Folgorato dal momentaneo successo ho deciso di applicare subito il nuovo giochino, ad esempio impiegandolo come funzione in un altro programma per provare anche ciò che mi hai detto a proposito dei return

    Purtroppo c'è qualcosa che non va...

    codice:
    /* Calolo dei numeri perfetti da 1 a 1000 */ 
    
    #include <stdio.h>
    
    main() {
    
    int k;
    
         for ( k = 2; k < 1000; k++ )        {
    
              if ( FATTORIZZAZIONE(k) )            /* = true */
                         printf ("Yep\n");
              else 
                         printf ("Sux\n");
                                       }                
        return 0;
           }
         
    FATTORIZZAZIONE() {
            
     /* Funzione per la fattorizzazione di un numero con calcolo della somma dei fattori */
            
     int numero; 
     int i;
     int n_attuale;
     int totale = 0;        
      
     n_attuale = numero;
     
             for ( i = 2; n_attuale > 1;) {
                    if ( ! ( n_attuale % i ) ) {
                      
                        n_attuale /= i; 
                        totale += i;
                           continue;
                    }
                    i ++;
     }
           
     if ( ( totale+1 ) == numero )  {
           
                  printf ("%d e' perfetto!!!\n", numero);
                    
           return 1;  
                                                     }           
     else 
           return 0;
                      
    }
    Quando hai un attimo gli dai un'occhiata?
    Non ho capito bene che ti serve fare
    Comunque scusa, ma il codice e' indentato malissimo... Non c'ho capito niente...
    Spero sia colpa del copia incolla per metterlo sul forum, perche' se no rinvenircisi e' parecchio difficile (soprattutto con programmi un po' piu' complessi)...



    A parte questo...
    Nel ciclo sommi alla variabile "totale" i suoi divisori man mano che vengono trovati...
    Ma e' molto difficile che la somma di questi valori dia come risultato il numero originario: dovresti anzi moltiplicare!

    prova ad assegnare alla var totale "1" quando la inizializzi, e poi nel ciclo, invece che sommarci la variabile i, moltiplicalo per la variabile i


    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  2. #12
    Utente bannato
    Registrato dal
    Jan 2003
    Messaggi
    1,414
    Hai ragione mi sono spiegato un po' male, ma sai a quest'ora

    Dovrebbe essere un programma che calcola i numeri perfetti compresi tra uno e mille. Un numero si dice perfetto quando la somma dei suoi fattori da come risultato il numero stesso...es:

    6 = 2*3*1
    2 + 3 + 1 = 6

    Quindi 6 è perfetto...

    E' un giochino abbastanza idiota, ma alla fine è per fare un po' di pratica

    Ti riposto il codice tenendolo in quote che almeno essendo più piccolo tiene meglio l'identatura e ci metto qualche commento va'

    codice:
    /* Calolo dei numeri perfetti */ 
    
    #include <stdio.h>
    main() {
    
    int k;
    
              for ( k = 2; k < 10; k++ )        {
    
                              if ( FATTORIZZAZIONE(k) )                         // nel caso abbia vuto un return 0 
                                                           printf ("Yep\n");
                              else 
                                                           printf ("Sux\n");
                                                              }                             
             return 0;
           }
         
    
    FATTORIZZAZIONE()        {
            
     /* Funzione per la fattorizzazione di un numero con calcolo della somma dei fattori */
            
     int numero; 
     int i;
     int n_attuale;
     int totale = 0;
          
     n_attuale = numero;
     
             for ( i = 2; n_attuale > 1;)              {
    
                    if ( ! ( n_attuale % i ) )     {     
           
                               n_attuale /= i; 
          totale += i;                                                       // aumenta di +i il contatore del totale fattori
       
              continue;
                                                           }
              i ++;
                                                                   }
            
     if ( ( totale+1 ) == numero )     {                          // se la somma dei fattori e' = al numero 
           
                  printf ("%d e' perfetto!!!\n", numero);
                    
           return 1;                                                        // dovrebbe essere "vero"
                                                }           
     else 
           return 0;                                                        // dovrebbe essere "falso"
               
            }
    Spero sia un po' più leggibile ora

    Teoricamente l'ouput dovrebbe essere una cosa del tipo:

    Yep
    6 e' un numero perfetto!
    ecc

    Io vado a letto... buonanotte

  3. #13
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Capito... E il problema dove sta? Cosa non funziona? Che errori da?

    Comunque... Te il valore alla variabile numero come gliel'assegni?


    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  4. #14
    Utente bannato
    Registrato dal
    Jan 2003
    Messaggi
    1,414
    Originariamente inviato da /dev/null

    Comunque... Te il valore alla variabile numero come gliel'assegni?
    Lol hai ragione

    Allora, ho creato un ciclo for in FATTORIZZAZIONE() prima dell'assegnamento

    n_attuale = numero

    Che faccia assumere a <numero> i valori da 1 a 10.

    Il programma si compila perfettamente, solo che l'output è composto di solo "sux" - in pratica questa condizione
    codice:
    if ( ( totale+1 ) == numero )     {                          // se la somma dei fattori e' = al numero stesso
           
                  printf ("%d e' perfetto!!!\n", numero);
                    
           return 1;
    Non si verifica mai...o sbaglio io a cercare di farla attivare così? :master:
    codice:
    if ( FATTORIZZAZIONE(k) )            /* = true? ( return 1;) */
                         printf ("Yep\n");
              else 
                         printf ("Sux\n");
    Secondo il mio pensiero contorto l'if doveva distinguere se il risultato di FATTORIZZAZIONE() è true ( quindi è terminato con un return 1 poichè la somma dei fattori di 6 è uguale a 6) o false ( return 0; ).

    Il fatto è che, essendo 6 un numero perfetto, dovrebbe restituire un true...e di conseguenza la scritta " 6 è un numero perfetto!"


  5. #15
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Ti consiglio prima di tutto di prenderti un buon libro oppure di farti assumere in una ditta come esperto di code obfuscation, perchè il tuo programma è abbastanza illeggibile

    Ho provato a fare una mia versione (sembra funzionare) che puoi analizzare.

    Non ho scritto commenti perchè è meglio se mi chiedi tu cosa non capisci!

    codice:
    /* Calolo dei numeri perfetti */ 
    
    #include <stdio.h>
    #include <math.h>
    
    bool isperfect(int n);
    
    int main()
    {
    	int k;
    	for(k=2; k<100; k++)
    	{
    		if(isperfect(k))
    			printf("%d e' un numero perfetto.\n", k);
    		else
    			printf("%d non lo e'.\n", k);
    	}
    	return 0;
    }
    
    bool isperfect(int n)
    {
    	int i, tot = 0, actual_n = n;
    	for(i=2; actual_n > 1;)
    	{
    		if(actual_n % i)
    			i++;
    		else
    		{
    			// Da decommentare se vuoi far vedere la scomposizione in fattori primi...
    			//printf("%d e' divisibile per %d\n",actual_n, i);
    			actual_n /= i;
    			tot += i;
    		}
    	}
    
    	if(tot + 1==n)
    		return 1;
    	else
    		return 0;
    }
    A parte che secondo i suoi calcoli 6 è l'unico numero perfetto

  6. #16
    Utente bannato
    Registrato dal
    Jan 2003
    Messaggi
    1,414
    Originariamente inviato da iguana13
    Ti consiglio prima di tutto di prenderti un buon libro oppure di farti assumere in una ditta come esperto di code obfuscation, perchè il tuo programma è abbastanza illeggibile

    A parte che secondo i suoi calcoli 6 è l'unico numero perfetto [/B]
    Potrei sbagliarmi, ma penso ci sia un errore nell'agoritmo che hai implementato:

    In questa parte di codice
    codice:
    for(i=2; actual_n > 1;)
            {
    1)                if(actual_n % i) 
    2)                       i++;                 
             else
                    {                        
                            actual_n /= i;
                            tot += i;
                    }
    Supponiamo che il valore di actual_n sia arrivato a 20:

    riga 1): 20 è divisibile per 2 ( i ) ...ma poi non devi aumentare [i] di 1, perche' anche 10 è divisibile per i = 2 !

    Bisogna dopo ogni divisione per < i > di actual_n fargli ritentare tutte le divisioni...partendo sempre da < i > = 2 ...

    Quindi mi sa che devi sostituire con una cosa così

    codice:
    /* I primi 7 numeri perfetti sono: 6, 28, 496, 8128, 33.550.336, 8.589.869.056 e 137.438.691.328 */
    int isperfect(int n)
    {
            int i, tot = 0, actual_n = n;
    
                    for ( i = 2; actual_n > 1;) 
      {
                             
           if ( ( actual_n % i ) == 0 ) {       
                                 
                             actual_n /= i;               
        tot += i;   
                         continue;
                    }
                    i ++;
          }
    
    
            if(tot + 1==n)
     
                    return 1;
            else
                    return 0;
    }
    Solo che non funziona lostesso
    Continua a trovare 6 come unico numero

    E soprattutto...non ho capito il meccanismo che hai usato per cui < actual_n > = < n > ...ma nessuno dei due hanno un valore di partenza...come funziona la cosa?

    Mi si sta formando in testa un casino terribile :master:

  7. #17
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Guarda che:
    codice:
    if(actual_n % i){...}
    è equivalente a:
    codice:
    if((actual_n % i)!= 0){...}
    quindi incrementa i solo se actual_n non è divisibile!

    28 = 1*2*2*7 = 4*7 = 14*2
    1+2+2+7 = 14 che è la sua metà
    4+7 = sempre 14
    14+2 = 16

    :master: non li capisco questi numeri xfetti

  8. #18
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Potresti cambiare algoritmo.
    Uno studio presentato da Pitagora e perfezionato da Euclide rivela che se 2^(n+1) - 1 è un numero primo, allora 2^n * (2^(n+1) - 1) è perfetto.

    Esempio: 6 = 2^1 * (2^2 - 1)

    Cmq ecco i primi 10 numeri perfetti:

    6
    28
    496
    8128
    33550336 (8 cifre)
    8589869056 (10 cifre)
    137438691328 (12 cifre)
    2305843008139952128 (19 cifre)
    2658455991569831744654692615953842176 (37 cifre)
    19156194260823610729479337808430363813099732154816 9216 (54 cifre)


    L'undicesimo numero perfetto è composto da 65 cifre, il dodicesimo da 77 e il tredicesimo da ben 279 cifre...
    Il programma saprai che funziona quando uscirà dal range del tipo :maLOL:

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  9. #19
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Ho fatto per curiosità una ricerca su internet ed ho scoperto che hai sbagliato definizione!

    Un numero è perfetto se è uguale alla somma di tutti i suoi divisori (escluso se stesso), non dei suoi fattori primi (come faceva il programma!)

    Ora si semplifica tutto:
    codice:
    bool isperfect(int n)
    {
    	int i, tot = 0;
    	for(i=1; i<n; i++)
    	{
    		if((n % i) == 0)
    		{
    			// Da decommentare se vuoi far tutti i divisori di n
    			//printf("%d e' divisibile per %d\n",actual_n, i);
    			tot += i;
    		}
    	}
    	if(tot==n)
    		return 1;
    	else
    		return 0;
    }
    ed i conti tornano... 6, 28, 496, 8128, ... il mio computer sta ancora calcolando!

  10. #20
    Utente bannato
    Registrato dal
    Jan 2003
    Messaggi
    1,414
    Oh, mi ero dimenticato di ringraziarvi tutti quanti per l'attenzione e l'aiuto...beh, meglio tardi che mai

    Grazie ancora e a presto!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.