Şimdi Ara

c de fibonacci sayılarında..

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
12
Cevap
0
Favori
1.662
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • fibonacci sayılarını kullanmam gerekiyor. 100 elemanlı olucak fibonacci serisi. Ben yaptım fakat bir süre sonra seride negatif eleman oluyor. Nedendir acep ?

        int a=0,b=1,c,i; 
    for(i=1;i<=100;i++)
    {
    c=a+b;
    printf("%d\n",c);
    b=a;
    a=c;
    }



    < Bu mesaj bu kişi tarafından değiştirildi SharpShoooterr -- 17 Kasım 2011; 1:16:48 >



  • quote:

    Orijinalden alıntı: SharpShoooterr

    fibonacci sayılarını kullanmam gerekiyor. 100 elemanlı olucak fibonacci serisi. Ben yaptım fakat bir süre sonra seride negatif eleman oluyor. Nedendir acep ?

        	for(i=1;i<=100;i++) 
    {
    c=a+b;
    printf("%d\n",c);
    b=a;
    a=c;
    }


    c = a + b
    printf....c
    a = b
    b = c


    olmasi gerekmiyor mu..
  • Benim yaptığım şekilde çalışıyor fibonacci serisi. tek sıkıntı bir süre sonra sayılar negatif oluyor
  • quote:

    Orijinalden alıntı: SharpShoooterr

    Benim yaptığım şekilde çalışıyor fibonacci serisi. tek sıkıntı bir süre sonra sayılar negatif oluyor

    Yok çalışıyordur da daha dediğim daha doğru bir ifade şekli olur en azından yazdığın koda bakanın amacı anlaması daha rahat olur.. yine de kendi seçimin..

    sorununa gelince, ben programlama işinin ehli değilim ama sanki değişkenlerinin değerleri 'int' içerisinde tutamayacağın kadar büyük rakamlara çıkıyor gibi geldi.. 32 bit sistemlerde 'int' 4 milyar küsüre kadar çıkar.. onun üstünü tutamazsın.. int yerine double felan gibi daha büyük bişey kullanman lazım..




  • #include <iostream>
    using namespace std;

    int main() {
    double a=0,b=1,c,i;
    for(i=1;i<=100;i++)
    {
    c=a+b;
    cout << c << "\n";
    b=a;
    a=c;
    }
    }
  • quote:

    Orijinalden alıntı: SharpShoooterr

    Benim yaptığım şekilde çalışıyor fibonacci serisi. tek sıkıntı bir süre sonra sayılar negatif oluyor

    100. fibonacci sayısı 354224848179261915075
  • quote:

    Orijinalden alıntı: littlestewie

    quote:

    Orijinalden alıntı: SharpShoooterr

    Benim yaptığım şekilde çalışıyor fibonacci serisi. tek sıkıntı bir süre sonra sayılar negatif oluyor

    100. fibonacci sayısı 354224848179261915075

    Nasıl oldu o. Acaba sayının türünü mü değiştircem. Yukarıda bi arkadaş double ile yapmış. tam sayı olarak olmazmı ?
  • int yerine unsigned int veya unsigned long kullanırsan sorunu çözersin.
    Bilgisayar hafızasında sayıların + ya da - işaretli olduklarını anlamak için en soldaki bit (int için 16 bitten en solda olanı) kullanılır; bu bit 0 ise sayı +, 1 ise sayı - kabul edilir. Sen fibonacci sayılarını hesaplarken bir noktadan sonra hesapladığın sayı 16 bitlik alanın 15 bitine sığamadığı için, 16'ıncı biti kullanmaya başlar ve onu 1 yapar, dolayısıyla sen de [signed] int kullandığın için, yani en soldaki biti işareti tutmaya kullandığın için bir anda kendini negatif sayıların arasında bulursun. unsigned int ve unsigned long en soldaki biti işaret için değil sayının kendi değerini tutmak için kullanır, dolayısıyla daha büyük sayıları hesaplayabilir ama negatif değer tutmazlar, daha doğrusu tuttukları değerin negatif mi pozitif mi olduğunu bilemezler. Double da 32 bit olduğu için muhtemelen 100'üncü fibonacciye kadar idare etmiştir.




  • 32 bit sistemde unsigned int ve unsigned long ikiside 32 bittir, yani bişey farketmez. Yerleşik tiplerde kullanılabilecek en uzun tip unsigned long long (64 bit) ki yukarıdaki 100. fibonacci sayısını o bile alamaz.

    Bu gibi işlerde harici bir kütüphaneden yardım almak en iyisi. Aşağıdaki kod GMP kütüphanesi kullanılarak 1000. fibonacci sayısını hesaplayıp yazdırıyor.

     
    #include <stdio.h>
    #include <gmp.h>

    int main()
    {
    int i;
    mpz_t a, b, c;

    mpz_inits(a, b, c, NULL);
    mpz_set_si(b, 1);

    for(i = 1; i <= 1000; i++) {
    mpz_add(c, a, b);
    mpz_set(b, a);
    mpz_set(a, c);
    }

    mpz_out_str(NULL, 10, c);

    return 0;
    }


    Çıktısı:
    43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875




  • Anladım teşekkkür ederim cevaplar için



    < Bu mesaj bu kişi tarafından değiştirildi SharpShoooterr -- 18 Kasım 2011; 1:30:18 >
  • Tabi C ile daha haşır-neşir olan arkadaşlar daha doğru cevaplar veriyor.
    Bu arada @elektro_gadget "64 bite 100'üncü fibonacci sığmaz" deyince sırf meraktan biraz araştırma yaptım: Google amcadan bulduğum kadarıyla 100'üncü fibonacci sayısı 354224848179261915075, ikili düzende ise şöyle yazılıyor:
    11000100101000100110000011100111111111011010100111001010001110
    burada 62 hane var, dolayısıyla long long yeterli olur gibi geliyor bana.


    düzeltme: ikili düzendeki yazılışı o değilmiş, windowsun hesap makinesine sığmamış sayının tamamı, o yüzden çeviri yanlış çıkmış. 100'üncü fibonacci sayısı muhtemelen @elektro_gadget'in de dediği gibi sığmayacak 64 bite...



    < Bu mesaj bu kişi tarafından değiştirildi un.real -- 18 Kasım 2011; 2:32:14 >




  • long int kullan.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.