Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di RiKi23
    Registrato dal
    Mar 2012
    Messaggi
    10

    [C] Creare una sequenza di numeri Fibonacci

    Ciao a tutti
    Ho un problema: vorrei creare un programma C che continui a stampare numeri della sequenza Fibonacci (0,1,1,2,3,5,8,13,21,34,55...).
    Questo è il codice:

    codice:
    #include <stdio.h>
    
    main()
    {
          int a;
          int b;
          int somma;
          a = 0;
          b = 1;
          while(0<1)
          {
                    printf("%d",a);
                    somma = a+b;
                    a = b;
                    b = somma;
                    printf("%d",a);
          }
    }
    Me lo compila senza problemi, ma quando lo si esegue spara di quei numeri impressionanti...
    Qualcuno riesce a capire dove sbaglio?!
    Grazie in anticipo
    RiKi23

  2. #2

    Re: [C] Creare una sequenza di numeri Fibonacci

    Originariamente inviato da RiKi23
    Me lo compila senza problemi, ma quando lo si esegue spara di quei numeri impressionanti...
    Il primo 0 stampalo fuori dal ciclo. Per il resto a parte separare un po' i numeri con printf("%d, ",a); non mi pare ci siano problemi. Chiaro che dopo pochi istanti il numero generato è superiore al massimo rappresentabile con un intero...

  3. #3
    Utente di HTML.it L'avatar di RiKi23
    Registrato dal
    Mar 2012
    Messaggi
    10
    Chiaro che dopo pochi istanti il numero generato è superiore al massimo rappresentabile con un intero...
    Quindi invece che dichiarare la variabile con "int" dovrei farlo con "long"?
    RiKi23

  4. #4
    A livello di algoritmo non sbagli...

    Il tuo problema non è che stampa numeri impressionanti, è che li stampa tutti attaccati.. prova a mettere intanto un limite al ciclo e non farlo infinito, e poi metti uno spazio alla sinistra dei numeri che stampi col printf
    lolide
    Java Programmer

    Informati

  5. #5
    Originariamente inviato da RiKi23
    Quindi invece che dichiarare la variabile con "int" dovrei farlo con "long"?
    Se sei su una macchina a 32 bit in linea di massima int e long sono la stessa roba; se sei su una macchina Linux a 64 bit long è a 64 bit, per cui riesci ad arrivare un po' oltre, ma in ogni caso non puoi superare 2^64 (per cui puoi arrivare attorno al 93esimo numero della successione).
    Se vuoi andare oltre puoi usare i double, con cui sui numeri grandi perdi in precisione, ma guadagni in range (dovresti arrivare in zona 1475 prima che stampi semplicemente "infinito").
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di RiKi23
    Registrato dal
    Mar 2012
    Messaggi
    10
    Originariamente inviato da lolide
    A livello di algoritmo non sbagli...

    Il tuo problema non è che stampa numeri impressionanti, è che li stampa tutti attaccati.. prova a mettere intanto un limite al ciclo e non farlo infinito, e poi metti uno spazio alla sinistra dei numeri che stampi col printf
    Tipo così?

    codice:
    #include <stdio.h>
    
    int main()
    {
        int n1 = 0;
        int n2 = 1;
        int conto = 0;
        int x;
        while(conto <= 50)
        {
                    x = n1 + n2;
                    n1 = n2;
                    n2 = x;
                    printf("%d\n",x);
                    conto++;
        }
        getchar();
    }
    Comunque dopo un po' comincia a stamparmi numeri negativi...
    RiKi23

  7. #7
    Originariamente inviato da RiKi23
    Comunque dopo un po' comincia a stamparmi numeri negativi...
    È normale, hai mandato in overflow un intero... puoi guadagnare un'iterazione in più usando un unsigned int (dopo non avrai numeri negativi ma ricomincerà da numeri "piccoli" a causa dell'overflow), oppure, come detto, puoi usare i double (nel qual caso, superato il range massimo, inizierà a produrre semplicemente "+inf", ovvero "infinito").
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.