Arama butonu
Bu konudaki kullanıcılar: 1 misafir
11
Cevap
1692
Tıklama
0
Öne Çıkarma
c de fibonacci sayılarında..
S
14 yıl
Teğmen
Konu Sahibi

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 >

N
14 yıl
Teğmen

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..


Bu mesaja 1 cevap geldi.
S
14 yıl
Teğmen
Konu Sahibi

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


Bu mesaja 2 cevap geldi.
N
14 yıl
Teğmen

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..


Bu mesaja 1 cevap geldi.
E
14 yıl
Çavuş

#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;
}
}



L
14 yıl
Binbaşı

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


Bu mesaja 1 cevap geldi.
S
14 yıl
Teğmen
Konu Sahibi

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ı ?


Bu mesaja 1 cevap geldi.
U
14 yıl
Binbaşı

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.


Bu mesaja 1 cevap geldi.
G
14 yıl
Yarbay

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


Bu mesaja 1 cevap geldi.
S
14 yıl
Teğmen
Konu Sahibi

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 >
Bu mesaja 1 cevap geldi.
U
14 yıl
Binbaşı

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 >
Bu mesaja 1 cevap geldi.
D
14 yıl
Binbaşı

long int kullan.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.