Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

C Sorusu(Fibonacci)


raider

Öne çıkan mesajlar

Hocamız bizden C dilinde 1000'e kadar bütün Fibonacci sayılarını hesaplatmamızı istiyor.fakat bunu lookup table,Linked list birde Structure kullanarak yapmamız gerek.Nasıl yapılacağı konusunda en ufak bir fikrim yok. Normal olarak 46. sayıya kadar hesaplatıyorum ama alakası yok tabi hocanın istediği ile.Nasıl yapacağım konusunda fikir verebilecek biri varmı? Yardım edebilecek arkadaşlar yardımını esirgemesin :)
Link to comment
Sosyal ağlarda paylaş

linked list mi. arrayla yapılır yahu, list ya da array kullanmanın tek olayı, bir önceki fibonacci sayısını saklamak ve böylece atıyorum n. fibonacci sayısını en baştan hesaplamak zorunda kalmamak .insanlar tabi genelde bu işi hissi olarak öyle yapıyor, ama algoritmik olarak önemli bir nokta. Yani 45. fibonacci numarasını hesaplaraken 44. fibonacci numarasını bilmekle hiç bir fibonacci numarasını bilmemek arasında dağlar kadar fark var.

neyse işin felsefesini bırakırsak, lookup table herhalde array oluyor, bu iş içinde array kullanmak mantıklı look up table'a gerek yok.


array_fib[];
array_fib[0]=1; //bu üçü ön tanımlı rakamlar olmak zorunda
array_fib[1]=1;


fibonacci(number){ //hesabı yapıp değeri döndüren fonk.
array_fib[number]= array_fib[number-1]+ array_fib[number-2];
return array_fib[number];
}

for(n=2;n<1000;n++) //fib arrayine değerleri atayan iterasyon
{
array_fib[number]=fibonacci(number);
}

print array_fib;

gibi basit geri dönümlü bir algoritma ile yapman mümkün (tabi bunu C'ye çevircen). gördüğün gibi burdaki kritik mantık, her adımda hesaplanan fibonacci rakamının bir arrayde saklanarak daha sonraki hesaplarda direk kullanılması. Yoksa 45. fibonacci rakamını hesaplarken, direk 43. ve 44. rakamı kayıtlı oldukları arrayden alıp toplamak yerine, başktan hesaplaman gerekecekti. Ki bunun 1000. fibonacci numarası için yapmak, daha önceki fibonacci rakamlarının kaydedilmediği bir algoritma ile, bir bilgisayar için bile çok zor (deneyip görülebilir), yapılacak işlem basit gözükse bile.

Linked list gibi bir datayapısıne hiç gerek yok burda, sadece hesaplanan değerleri bir arrayde saklaman algoritmayı yeterince hızlı yapacaktır.
Link to comment
Sosyal ağlarda paylaş

Buarada ben burda geri dönüm değil iterasyon kullanmışım zaten (kafamı karıştırıyor bu recursion :p). Yukarda tabi arrayle ilgili sorunlar var onu gördüm (en azından c++da çalışmaz) çünkü fonksiyon içersindeki array fonksiyon bitince siliniyor eğer başka bir fonksiyona referans değilse. Kısacası arrayi fonksiyona sokarken referans kullanman lazım c++ ile yazıyorsan. Ama tabi ben perlle yazmaya alışık olduğum için arrayi global olarak tanımlaman yeterli.


Lazımsa recursion olarak da yazarım. Hatta yazdım. Burda da mainde bir array oluşturmak yerine direk verdiğin rakamı hesaplayıp sana gönderiyor. Ama bu fonksiyon verilen tek bir fibonacci rakamının bulmak için uygun. 1den 1000e kadar hepsini hesapla dersen yine main içersinde bir arrayde saklaman lazım bulduğun değerleri, yoksa algoritmanın hesap süresi n^2 olur (yani istediğin fibonacci rakamının yaklaşık olarak karesiyle orantılı olarak artar gereken süre).



fibonacci(number){ //hesabı yapıp değeri döndüren fonk.

array_fib[];
array_fib[0]=1; //bu üçü ön tanımlı rakamlar olmak zorunda
array_fib[1]=1;

if(number!=0 AND number!=1)
{
array_fib[number]= fibonacci(number-1) + fibonacci(number-2);
return array_fib[number];
}

else return 1;

}

Main{

fibonacci1000=fibonacci(1000);
print fibonacci1000;

}
Link to comment
Sosyal ağlarda paylaş

Dediğiniz yöntemler ile bende yapabiliyorum fakat, O şekilde en fazla 46 ya kadar hesaplıyabiliyor bilgisayar.Direk soruyu yazayım benen iyisi :) ;

"Your program should be able to calculate up to the 1000th fibonacci number. the large fibonacci numbers cannot be stored in an integer variable. so you have to desing an algorithm that can store these large numbers.you will use linked list data type for this problem.
you should use a lookup table in order to store already calculated fibonacci numbers.for the lookup table you will use pointer array."

Structure kullanılacak derken recursive olarak kullanılacak sanırım linked list yapmak için.kafamda işin mantığını oturta bilsem.
Link to comment
Sosyal ağlarda paylaş

recursion ve ve c ya da c++ gibi çin işkencesi bir dil kullanırsan evet. Fakat iterasyon ve perl gibi kolay ve basit bir dil kullanırsan (tamam belki c++ kadar kuvvetli ve c kadar hızlı olmasa bile);

algoritma:

#!/usr/bin/perl -w
@fib=();
$fib[0]=1;
$fib[1]=1;

for($number=2;$number {
$fib[$number]= $fib[$number-1]+ $fib[$number-2];
print $number."th number is".$fib[$number]."n";
}

sonuç(2 saniye falan sürdü ya da sürmedi):


http://img87.imageshack.us/img87/1614/sonuvx7.jpg


Ha C için, muhtemelen long integer falan kullanman gerekiyor olabilir. O da yetmezse ya da şöyle yapabilirsin belki (bunu hiç denemedim sallıyorum şu an) sonucu resimdeki gibi string olarak saklarsın (bilmem kaç e199), kullanılması gerektiği zaman integer'a çevirirsin..Ama zaten perl bu tür şeyleri otomatikman yaptığı için uzun süredir hiç uğraşmam gerekmedi c++ ve c'nin nazıyla :p

Link to comment
Sosyal ağlarda paylaş

Ardeth cim iyi guzel yazmissin da, C odeviyse bu probleme degil, implementasyon detaylarina dikkat edilmesi gerekiyor. Tabi ki yapilan cogu odevin cok daha basit ve sade bir yolu olacak. Ama hoca bilinen basit bir ornegi konuya uyarlamak istemis.

Ha ben de anlamadim hem lookup table hem linked list ne alaka. Ama structure dedigin heralde C deki struct lar, ve bu iki data structure dan biirni yapmak istiyorsan struct kullanman pek mantikli.
Link to comment
Sosyal ağlarda paylaş

abi link list struct kullanmayın demişsiniz de ödevin konusu o nası kullanmasın :D
yani arayle yapıyosan aynısını link listle de yapabilirsin. link list konusunda hiç bi fikrin yoksa, oturup öğrenmeni tavsiye ederim çok zor değildir.

her yeni sayı için malloc ile yer açıp buna da struct taki node unu koyucaksın. structında bir number bide link diye iki kısım olcak, linkinde bir sonraki objen olucak. yani yeni yarattıkça bunun adresini bir öncekinin linkine yazıcaksın. böle böle aray mantığını bozmadan aynı algoritmayı kullanabilirsin.
Link to comment
Sosyal ağlarda paylaş

128 bit olarak C# da bir arkadasim sagolsun c++ a cevirdi yardimci olur mu bilmem, buyur anam...

C#


class Fibonacci4
{
static decimal golden_ratio = (1.0M + DecSqrt(5.0M)) / 2.0M;

private static decimal DecSqrt(decimal x)
{
decimal y;
y = (decimal)Math.Sqrt((double)x);
y = (y + x / y) / 2.0M;
y = (y + x / y) / 2.0M;
return (y);
}

public static void Main()
{
decimal lo = 1M;
decimal hi = 1M;
decimal n = 1M;
decimal ratio;
Console.Write("{0,3:N0}", n);

Console.Write("t");

Console.WriteLine("{0,39:N0}", lo);

try
{
while (hi > 0M)
{
n++;

Console.Write("{0,3:N0}", n);
Console.Write("t");
Console.Write("{0,39:N0}", hi);
Console.Write("t");

ratio = hi / lo;

Console.Write("{0,37:F30}", ratio);
Console.Write("t");
Console.WriteLine("{0,37:F30}", ratio - golden_ratio);

hi = lo + hi;
lo = hi - lo;
}
}
catch (System.OverflowException) { }
}
}


C++


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#if defined(__sun)
#include <sunmath.h>
#endif

long long
fib_internal(long long n, long long i, long long previous, long long present)
{
return (i == n) ? present : fib_internal(n, i + 1, present, previous + present);
}

long long
fib(long long n)
{
return fib_internal(n, 1, 0, 1);
}

int
main(void)
{
long long fn = 1LL;
long long fnm1 = 1LL;
long long n = 1LL;
long double ratio;
long double golden_ratio = (1.0 + sqrtl(5.0))/2.0;

(void)printf("%2lldt%19lldn", n, fnm1);

for (;;)
{
n++;
fnm1 = fn;
fn = fib(n);
if (fn < 0LL)
break;
ratio = (long double)fn/(long double)fnm1;
(void)printf("%2lldt%19lldt%37.33Lft%37.33Lfn",
n, fn, ratio, (ratio - golden_ratio));
}
return (EXIT_SUCCESS);
}
Link to comment
Sosyal ağlarda paylaş

C# Output :


1 1
2 1 1.000000000000000000000000000000 -0.618033988749894848204586834400
3 2 2.000000000000000000000000000000 0.381966011250105151795413165600
4 3 1.500000000000000000000000000000 -0.118033988749894848204586834400
5 5 1.666666666666666666666666666700 0.048632677916771818462079832300
6 8 1.600000000000000000000000000000 -0.018033988749894848204586834400
7 13 1.625000000000000000000000000000 0.006966011250105151795413165600
8 21 1.615384615384615384615384615400 -0.002649373365279463589202219000
9 34 1.619047619047619047619047619000 0.001013630297724199414460784600
10 55 1.617647058823529411764705882400 -0.000386929926365436439880952000
11 89 1.618181818181818181818181818200 0.000147829431923333613594983800
12 144 1.617977528089887640449438202200 -0.000056460660007207755148632200
13 233 1.618055555555555555555555555600 0.000021566805660707350968721200
14 377 1.618025751072961373390557939900 -0.000008237676933474814028894500
15 610 1.618037135278514588859416445600 0.000003146528619740654829611200
16 987 1.618032786885245901639344262300 -0.000001201864648946565242572100
17 1,597 1.618034447821681864235055724400 0.000000459071787016030468890000
18 2,584 1.618033813400125234815278647500 -0.000000175349769613389308186900
19 4,181 1.618034055727554179566563467500 0.000000066977659331361976633100
20 6,765 1.618033963166706529538387945500 -0.000000025583188318666198888900
21 10,946 1.618033998521803399852180340000 0.000000009771908551647593505600
22 17,711 1.618033985017357938973140873400 -0.000000003732536909231445961000
23 28,657 1.618033990175597086556377392600 0.000000001425702238351790558200
24 46,368 1.618033988205325051470844819800 -0.000000000544569796733742014600
25 75,025 1.618033988957902001380262249800 0.000000000208007153175675415400
26 121,393 1.618033988670443185604798400500 -0.000000000079451662599788433900
27 196,418 1.618033988780242682856507376900 0.000000000030347834651920542500
28 317,811 1.618033988738303006852732438000 -0.000000000011591841351854396400
29 514,229 1.618033988754322537608830405500 0.000000000004427689404243571100
30 832,040 1.618033988748203621343798191100 -0.000000000001691226860788643300
31 1,346,269 1.618033988750540839382721984500 0.000000000000645991178135150100
32 2,178,309 1.618033988749648101530971893400 -0.000000000000246746673614941000
33 3,524,578 1.618033988749989097047296779300 0.000000000000094248842709944900
34 5,702,887 1.618033988749858848350071980200 -0.000000000000035999854514854200
35 9,227,465 1.618033988749908598925421457600 0.000000000000013750720834623200
36 14,930,352 1.618033988749889595896597819700 -0.000000000000005252307989014700
37 24,157,817 1.618033988749896854407719255400 0.000000000000002006203132421000
38 39,088,169 1.618033988749894081903178586000 -0.000000000000000766301408248400
39 63,245,986 1.618033988749895140905679158300 0.000000000000000292701092323900
40 102,334,155 1.618033988749894736402718110800 -0.000000000000000111801868723600
41 165,580,141 1.618033988749894890909100681000 0.000000000000000042704513846600
42 267,914,296 1.618033988749894831892914018000 -0.000000000000000016311672816400
43 433,494,437 1.618033988749894854435091436900 0.000000000000000006230504602500
44 701,408,733 1.618033988749894845824745843300 -0.000000000000000002379840991100
45 1,134,903,170 1.618033988749894849113605205100 0.000000000000000000909018370700
46 1,836,311,903 1.618033988749894847857372713100 -0.000000000000000000347214121300
47 2,971,215,073 1.618033988749894848337210827300 0.000000000000000000132623992900
48 4,807,526,976 1.618033988749894848153928976800 -0.000000000000000000050657857600
49 7,778,742,049 1.618033988749894848223936414200 0.000000000000000000019349579800
50 12,586,269,025 1.618033988749894848197195952600 -0.000000000000000000007390881800
51 20,365,011,074 1.618033988749894848207409900000 0.000000000000000000002823065600
52 32,951,280,099 1.618033988749894848203508519200 -0.000000000000000000001078315200
53 53,316,291,173 1.618033988749894848204998714100 0.000000000000000000000411879700
54 86,267,571,272 1.618033988749894848204429510300 -0.000000000000000000000157324100
55 139,583,862,445 1.618033988749894848204646926800 0.000000000000000000000060092400
56 225,851,433,717 1.618033988749894848204563881100 -0.000000000000000000000022953300
57 365,435,296,162 1.618033988749894848204595601700 0.000000000000000000000008767300
58 591,286,729,879 1.618033988749894848204583485500 -0.000000000000000000000003348900
59 956,722,026,041 1.618033988749894848204588113500 0.000000000000000000000001279100
60 1,548,008,755,920 1.618033988749894848204586345800 -0.000000000000000000000000488600
61 2,504,730,781,961 1.618033988749894848204587021000 0.000000000000000000000000186600
62 4,052,739,537,881 1.618033988749894848204586763100 -0.000000000000000000000000071300
63 6,557,470,319,842 1.618033988749894848204586861600 0.000000000000000000000000027200
64 10,610,209,857,723 1.618033988749894848204586824000 -0.000000000000000000000000010400
65 17,167,680,177,565 1.618033988749894848204586838300 0.000000000000000000000000003900
66 27,777,890,035,288 1.618033988749894848204586832800 -0.000000000000000000000000001600
67 44,945,570,212,853 1.618033988749894848204586834900 0.000000000000000000000000000500
68 72,723,460,248,141 1.618033988749894848204586834100 -0.000000000000000000000000000300
69 117,669,030,460,994 1.618033988749894848204586834500 0.000000000000000000000000000100
70 190,392,490,709,135 1.618033988749894848204586834300 -0.000000000000000000000000000100
71 308,061,521,170,129 1.618033988749894848204586834400 0.000000000000000000000000000000
72 498,454,011,879,264 1.618033988749894848204586834400 0.000000000000000000000000000000
73 806,515,533,049,393 1.618033988749894848204586834400 0.000000000000000000000000000000
74 1,304,969,544,928,657 1.618033988749894848204586834400 0.000000000000000000000000000000
75 2,111,485,077,978,050 1.618033988749894848204586834400 0.000000000000000000000000000000
76 3,416,454,622,906,707 1.618033988749894848204586834400 0.000000000000000000000000000000
77 5,527,939,700,884,757 1.618033988749894848204586834400 0.000000000000000000000000000000
78 8,944,394,323,791,464 1.618033988749894848204586834400 0.000000000000000000000000000000
79 14,472,334,024,676,221 1.618033988749894848204586834400 0.000000000000000000000000000000
80 23,416,728,348,467,685 1.618033988749894848204586834400 0.000000000000000000000000000000
81 37,889,062,373,143,906 1.618033988749894848204586834400 0.000000000000000000000000000000
82 61,305,790,721,611,591 1.618033988749894848204586834400 0.000000000000000000000000000000
83 99,194,853,094,755,497 1.618033988749894848204586834400 0.000000000000000000000000000000
84 160,500,643,816,367,088 1.618033988749894848204586834400 0.000000000000000000000000000000
85 259,695,496,911,122,585 1.618033988749894848204586834400 0.000000000000000000000000000000
86 420,196,140,727,489,673 1.618033988749894848204586834400 0.000000000000000000000000000000
87 679,891,637,638,612,258 1.618033988749894848204586834400 0.000000000000000000000000000000
88 1,100,087,778,366,101,931 1.618033988749894848204586834400 0.000000000000000000000000000000
89 1,779,979,416,004,714,189 1.618033988749894848204586834400 0.000000000000000000000000000000
90 2,880,067,194,370,816,120 1.618033988749894848204586834400 0.000000000000000000000000000000
91 4,660,046,610,375,530,309 1.618033988749894848204586834400 0.000000000000000000000000000000
92 7,540,113,804,746,346,429 1.618033988749894848204586834400 0.000000000000000000000000000000
93 12,200,160,415,121,876,738 1.618033988749894848204586834400 0.000000000000000000000000000000
94 19,740,274,219,868,223,167 1.618033988749894848204586834400 0.000000000000000000000000000000
95 31,940,434,634,990,099,905 1.618033988749894848204586834400 0.000000000000000000000000000000
96 51,680,708,854,858,323,072 1.618033988749894848204586834400 0.000000000000000000000000000000
97 83,621,143,489,848,422,977 1.618033988749894848204586834400 0.000000000000000000000000000000
98 135,301,852,344,706,746,049 1.618033988749894848204586834400 0.000000000000000000000000000000
99 218,922,995,834,555,169,026 1.618033988749894848204586834400 0.000000000000000000000000000000
100 354,224,848,179,261,915,075 1.618033988749894848204586834400 0.000000000000000000000000000000
101 573,147,844,013,817,084,101 1.618033988749894848204586834400 0.000000000000000000000000000000
102 927,372,692,193,078,999,176 1.618033988749894848204586834400 0.000000000000000000000000000000
103 1,500,520,536,206,896,083,277 1.618033988749894848204586834400 0.000000000000000000000000000000
104 2,427,893,228,399,975,082,453 1.618033988749894848204586834400 0.000000000000000000000000000000
105 3,928,413,764,606,871,165,730 1.618033988749894848204586834400 0.000000000000000000000000000000
106 6,356,306,993,006,846,248,183 1.618033988749894848204586834400 0.000000000000000000000000000000
107 10,284,720,757,613,717,413,913 1.618033988749894848204586834400 0.000000000000000000000000000000
108 16,641,027,750,620,563,662,096 1.618033988749894848204586834400 0.000000000000000000000000000000
109 26,925,748,508,234,281,076,009 1.618033988749894848204586834400 0.000000000000000000000000000000
110 43,566,776,258,854,844,738,105 1.618033988749894848204586834400 0.000000000000000000000000000000
111 70,492,524,767,089,125,814,114 1.618033988749894848204586834400 0.000000000000000000000000000000
112 114,059,301,025,943,970,552,219 1.618033988749894848204586834400 0.000000000000000000000000000000
113 184,551,825,793,033,096,366,333 1.618033988749894848204586834400 0.000000000000000000000000000000
114 298,611,126,818,977,066,918,552 1.618033988749894848204586834400 0.000000000000000000000000000000
115 483,162,952,612,010,163,284,885 1.618033988749894848204586834400 0.000000000000000000000000000000
116 781,774,079,430,987,230,203,437 1.618033988749894848204586834400 0.000000000000000000000000000000
117 1,264,937,032,042,997,393,488,322 1.618033988749894848204586834400 0.000000000000000000000000000000
118 2,046,711,111,473,984,623,691,759 1.618033988749894848204586834400 0.000000000000000000000000000000
119 3,311,648,143,516,982,017,180,081 1.618033988749894848204586834400 0.000000000000000000000000000000
120 5,358,359,254,990,966,640,871,840 1.618033988749894848204586834400 0.000000000000000000000000000000
121 8,670,007,398,507,948,658,051,921 1.618033988749894848204586834400 0.000000000000000000000000000000
122 14,028,366,653,498,915,298,923,761 1.618033988749894848204586834400 0.000000000000000000000000000000
123 22,698,374,052,006,863,956,975,682 1.618033988749894848204586834400 0.000000000000000000000000000000
124 36,726,740,705,505,779,255,899,443 1.618033988749894848204586834400 0.000000000000000000000000000000
125 59,425,114,757,512,643,212,875,125 1.618033988749894848204586834400 0.000000000000000000000000000000
126 96,151,855,463,018,422,468,774,568 1.618033988749894848204586834400 0.000000000000000000000000000000
127 155,576,970,220,531,065,681,649,693 1.618033988749894848204586834400 0.000000000000000000000000000000
128 251,728,825,683,549,488,150,424,261 1.618033988749894848204586834400 0.000000000000000000000000000000
129 407,305,795,904,080,553,832,073,954 1.618033988749894848204586834400 0.000000000000000000000000000000
130 659,034,621,587,630,041,982,498,215 1.618033988749894848204586834400 0.000000000000000000000000000000
131 1,066,340,417,491,710,595,814,572,169 1.618033988749894848204586834400 0.000000000000000000000000000000
132 1,725,375,039,079,340,637,797,070,384 1.618033988749894848204586834400 0.000000000000000000000000000000
133 2,791,715,456,571,051,233,611,642,553 1.618033988749894848204586834400 0.000000000000000000000000000000
134 4,517,090,495,650,391,871,408,712,937 1.618033988749894848204586834400 0.000000000000000000000000000000
135 7,308,805,952,221,443,105,020,355,490 1.618033988749894848204586834400 0.000000000000000000000000000000
136 11,825,896,447,871,834,976,429,068,427 1.618033988749894848204586834400 0.000000000000000000000000000000
137 19,134,702,400,093,278,081,449,423,917 1.618033988749894848204586834400 0.000000000000000000000000000000
138 30,960,598,847,965,113,057,878,492,344 1.618033988749894848204586834400 0.000000000000000000000000000000
139 50,095,301,248,058,391,139,327,916,261 1.618033988749894848204586834400 0.000000000000000000000000000000


Link to comment
Sosyal ağlarda paylaş

tabi table'ın diğer indeksi de kaçıncı sayı olduğu olacak.

Misal 103. fibonacci sayısı atıyorum 1.456563 x 10^13 ise

Bunu 103. row'a 13'a columna sadece 1.456563 olarak koyacaksın ve 13. sayıyı okuman gerektiği zaman ordan 1.456563 olarak alıp daha sonra 10^103 ile çarparak kullanacaksın. Şuan sadece c++ın o kadar büyük bir integerı depolama sorununa odaklanmış olarak bunu söylüyorum tabi linked listi'de her zaman bir array yerine kullanabilirsin. Volfiedin dediği gibi bir implementasyon sorusu ise aslında nasıl kullandığından ziyade doğru kullanıp kullanmadığın daha önemli olabilir. Ama yine de ben böyle sorulara karşıyım, sırf implementasyon koyacağım diye mantığıa aykırı gereksiz sorulara yani :p linked listin vs kullanılabileceği çok daha güzel sorular üretmek mümkün.

ha birde tekrarlıyorum doğru bir recursion yapısı kullanmazsan muhtemelen bilgisayarının kapasitesi yetmeyecektir hesabı yapmaya (depolmaktan değil hesabı yapmaktan bahsediyorum zira dediğim gibi n^2 seviyesinde bir hesap olacaktır). İterasyon kullanman daha kolay olur ama tabi her iterasyon tıpa tıp aynı şeyi yapan bir recursiona da çevrilebilir illa lazımsa.
Link to comment
Sosyal ağlarda paylaş

Arkadaş da onu diyor zaten, hoca öyle bir yöntem bulun ki 1000. fibonacci sayısına kadar hesaplayın ve hafızada tutabilin. Ve yine yukarda anlattığım gibi perl o kadar büyük sayıları 1.23454 e100 gibi bir formatta saklayabiliyor. Aynı mantığı c++da 2 dimensional bir arrayle implement etmek de mümkün. Sorunun senden beklediği ve çözmeni istediği problem 130dan sonra başlıyor zaten. Bir de senin kullandığın yöntem çok yakın bir approximation altın oranı kullanan ama 4-5 satırlık kodla gerçek fibonacci sayısını bulman mümkün zaten o kadar yazmaya gerek yok bence. Sadece geride kalan sayıları bir arrayde saklamayı unutmamak lazım yoksa çok uzun sürer. Belki altın oran bilmem kaç milyonuncu fibonacci sayısını bulmak için daha mantıklı ama 1000. fibonacci için normal algoritmayı kurman yeterli.
Link to comment
Sosyal ağlarda paylaş

soyle bir sey yapabilirsin

lookup table da her entry bir linked list node una pointer
her linked list ayri bir sayiyi temsil edecek.

Integer saklayabilirsin bundan sonra, ne de olsa biliyoruz ki her Fibonacci sayisi bir integer.
sayinin ne kadar buyuk oldugu farketmez, ilk integer (node) sayinin max unsigned int (32 bit de sanirsam 2^32 ye denk geliyordu bu) modulo her ne ise, ondan sonraki 32 bit right shift edip tekrar ayni sey tekrar ayni sey, taki shift edilecek bit kalmayana kadar

yani 0xFFFFFFFF bir integer in alabilecegi max deger ise, her node un 0xFFFFFFFF in powerlarina gore temsil eder.

Daha sonra bunu decimal a dokmek istediginde de convert edersin geri.

Veyahut rahat rahat gosterebilmek istiyorsan, her 1 milyon unu string olarak saklarsin, daha sonra toplama cikartma yaparken de iki node u toplarsin, arta kalani bir sonraki node a verirsin.

Boylece lookup table ve linked list le baya buyuk sayilari store edebilecegin cok anlamsiz bir data structure un olmus olur :)
Link to comment
Sosyal ağlarda paylaş

Biraz daha dusundum daha da mantikli geldi. Her node da 1 milyar max tutarsin (32 bit sonuc olarak 4 milyar a yuvarlanabilir)

daha sonra toplarken iki node un maximum toplamindan artakalabilecek tke sey 1 olur bir sonraki node a, bunu da bir flag ile rahatca halledebilirsin

cok guzel recursive function da yazilir hatta, hocaya da gosterirsin bakin hem lookup table (node pointerlar ilen) hem de linked list ile guzel bi sekild buyuk sayilari saklayabiliyorum.
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...