[C]Ricorsione - Numeri perfetti
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 12 di 12

Discussione: [C]Ricorsione - Numeri perfetti

Cambio titolo
  1. #1
    SeeYouInSpaceCowboy... L'avatar di balmung91
    Registrato il
    10-04
    Località
    Nei miei Trip
    Messaggi
    879

    [C]Ricorsione - Numeri perfetti

    Seguendo gli esercizi di fine capitolo del mio libro, ne ho fatto uno che mi sembrava interessante, cioè fare in un programma che con la ricorsione trovi tutti i numeri perfetti in numeri da 1 a "int limite".

    smadonnando un po' funziona..solo fino ai primi due numeri -.- (6 e 28) se gli cerco di far legger anche 496 (il 3° ) me lo legge e subito dopo crasha senza continuare con gli altri...why ?

    non badate a tutti i printf e i getch commentati, mi servivano per vedere l'andamento delle variabili e capire dove sbagliava

    codice:
    Spoiler:

    Codice:
    #include <stdio.h>
    int limite;
    int divisore;
    int CountPerfect = 0;
    
    int perfect(int limit);
    
    int main()
    {
      printf("ora calcolero' tutti i numeri perfetti da 1 a: ");
      scanf("%d", &limite);
      divisore = limite -1;
      //printf("divisore(%d) = limite(%d) -1\n", divisore, limite);
      perfect(limite);
      getch();
      return 0;
    }
    
    int perfect(int limite)
    {
      if(limite == 0)
      {
        return 0;
      }
      
      if(divisore == 0)
      {    if(CountPerfect == limite)
        {
          printf("\n%d e un numero perfetto\n", limite);
          getch();
        }
        CountPerfect = 0;
        //printf("CountPerfect = 0\n");
        limite--;
        divisore = limite - 1;
        //printf("divisore(%d) = limite-2(%d)\n", divisore, limite);
        //printf("Riinizia la funzione con limite-1 (%d)\n", limite);
        //getch();
        return perfect(limite);
      }
       
    
      
      if((limite % divisore) == 0)
      {
        //printf("Limite (%d) %% Divisore (%d) = 0\n", limite, divisore);      
        //printf("CountPerfect = %d\n" ,CountPerfect);
        CountPerfect += divisore;
        //printf("CountPerfect + divisore = %d\n",CountPerfect);
        
    
        divisore -= 1;
        return perfect(limite);
      }
      if(!((limite % divisore) == 0))
      {
        divisore -= 1;
        return perfect(limite);
      }
    }


    ty

    ps: numeri perfetti sono numeri che sono uguali alla somma di tutti i loro divisori esclusi loro stessi.


    www.webapocalypse.org
    In ottimo stile web 2.0 ho anchio un ombra sotto di me. Sono uscito dalla fabbrica così ben 17 anni fa.[cit.]


  2. #2
    N Y A N ! L'avatar di Iron84
    Registrato il
    04-05
    Località
    Ferrara (provincia)
    Messaggi
    6.131
    strano, l'ho provato da me e funziona, almeno fino a 8128. ho provato a farglieli calcolare fino a 15000, poi mi sa che diventa lunghetta la cosa XD

    forse stai chiedendo troppo allo stack : O

    ah, alla fine della funzione, inverti la posizione dei due if, e trasformali in un if-else, dovresti velocizzarlo un po', visto che i divisori sono pochi rispetto al numero da cui li stai calcolando

  3. #3
    Puppppppaaaaaaaaaaa L'avatar di Revan1985
    Registrato il
    01-06
    Località
    Solbiate Olona
    Messaggi
    1.655
    il coduce nu sembra ok,a nche se un poco pesantuccio... almeno x cpu nn troppo potenti

    prova a usare i float, dovresti arrivare sul milione come numero perfetto...
    con l'int si fermerà al numero perfettto precedente a 65536 se nn erro...


    nn che mi ricordi molto il limite dei tipi
    È stato detto che la democrazia è la peggior forma di governo, eccezion fatta per tutte quelle altre forme che si sono sperimentate finora.


  4. #4
    N Y A N ! L'avatar di Iron84
    Registrato il
    04-05
    Località
    Ferrara (provincia)
    Messaggi
    6.131
    il codice in se va bene, almeno riguardo all'algoritmo che usa (non so se esistano altre tecniche per calcolare i numeri perfetti), anche se sicuramente &#232; meglio farlo iterativo piuttosto che ricorsivo, lo stack non &#232; certo infinito :P

    ah, con un unsigned int puoi tipicamente arrivare fino a 2^32 (4 miliardi e spiccioli)

  5. #5
    SeeYouInSpaceCowboy... L'avatar di balmung91
    Registrato il
    10-04
    Località
    Nei miei Trip
    Messaggi
    879
    l'ho fatto ricorsivo perch&#232; chiedeva cos&#236; e cmq dovevo fare pratica con le ricorsioni ^^

    cmq non so a me crasha...se metto un numero superiore di poco a 496 mi trova 496 e crasha, s eno crasha diretto.

    il pc non &#232;, ho 2GB in dual, un opty165 @ 2.4ghz

    gli ultimi due if volevo farli if\else poi non so poerch&#232; ho fatto cos&#236;

    l'ho compilato con dev-c++ voi ?
    magari &#232; quello


    www.webapocalypse.org
    In ottimo stile web 2.0 ho anchio un ombra sotto di me. Sono uscito dalla fabbrica così ben 17 anni fa.[cit.]


  6. #6
    StorieDallaSalaMacchine L'avatar di miniBill '90
    Registrato il
    08-05
    Località
    Bergerac
    Messaggi
    4.204
    con il C++ non so, ma con il C#(ho tradotto il programma per provarlo) mi da una stack overflow exception.
    e usare un while invece di una ricorsione?
    l'ho modificato ora funziona:
    sostituisci
    int perfect(int limite)
    {

    con

    int perfect(int limite){
    while(true){

    e ogni

    return perfect(limite);

    con un semplice

    continue;
    Ultima modifica di miniBill '90; 26-09-2006 alle 17:56:29

    ESISTE UN UNICO AMMINISTRATORE
    Quoto-thisisgorman-
    (La mi ex-firma sta qua)

  7. #7
    SeeYouInSpaceCowboy... L'avatar di balmung91
    Registrato il
    10-04
    Località
    Nei miei Trip
    Messaggi
    879
    ho usato la ricorsione, come scritto sopra, proprio per far pratica con essa
    il libro mi diceva gi&#224; che sarebbe stato meglio farlo con cicli iterativi


    www.webapocalypse.org
    In ottimo stile web 2.0 ho anchio un ombra sotto di me. Sono uscito dalla fabbrica così ben 17 anni fa.[cit.]


  8. #8
    StorieDallaSalaMacchine L'avatar di miniBill '90
    Registrato il
    08-05
    Località
    Bergerac
    Messaggi
    4.204
    Citazione Revan1985
    il coduce nu sembra ok,a nche se un poco pesantuccio... almeno x cpu nn troppo potenti

    prova a usare i float, dovresti arrivare sul milione come numero perfetto...
    con l'int si fermerà al numero perfettto precedente a 65536 se nn erro...


    nn che mi ricordi molto il limite dei tipi
    nel C++ credo lo stesso, cmq nel C# int.MaxValue = 2147483647
    infatti int(nel C#) è un alias per il tipo int32(intero con segno a 32 bit) del .net fx

    ESISTE UN UNICO AMMINISTRATORE
    Quoto-thisisgorman-
    (La mi ex-firma sta qua)

  9. #9
    Agathos
    Ospite
    ehi balmung?
    Si tratta del manuale dei fratelli Deitel?

  10. #10
    SeeYouInSpaceCowboy... L'avatar di balmung91
    Registrato il
    10-04
    Località
    Nei miei Trip
    Messaggi
    879
    si ^^


    www.webapocalypse.org
    In ottimo stile web 2.0 ho anchio un ombra sotto di me. Sono uscito dalla fabbrica così ben 17 anni fa.[cit.]


  11. #11
    Agathos
    Ospite
    Quindi sei al capitolo 5!
    Dopo quanto tempo?

  12. #12
    SeeYouInSpaceCowboy... L'avatar di balmung91
    Registrato il
    10-04
    Località
    Nei miei Trip
    Messaggi
    879
    boh il tempo non lo so asd... cmq sono al 7 asd, solo che ogni tanto vado indietro a fare gli esercizi lunghi che non ho fatto XD


    www.webapocalypse.org
    In ottimo stile web 2.0 ho anchio un ombra sotto di me. Sono uscito dalla fabbrica così ben 17 anni fa.[cit.]


Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •