フィボナッチ数列を100項まで計算しようとするとunsigned long longでもたりないらしい
タイトルのとおり。
#include
#include
int main(int argc, char *argv[])
{
unsigned long long int a, b, tmp;
int n, i;
n = atoi(argv[1]);
a = 1;
b = 1;
for (i = 1; i <= n; i++) {
printf("%lld\n", a);
tmp = a + b;
a = b;
b = tmp;
}
return 0;
}
実行結果:
takatoh@nightschool $ ./fib 100
1
1
2
3
5
8
13
21
34
(中略)
4660046610375530309
7540113804746346429
12200160415121876738
1293530146158671551
13493690561280548289
14787220707439219840
9834167195010216513
6174643828739884737
16008811023750101250
3736710778780434371
最後のほうで桁が少なくなったり、明らかにおかしな数値になってしまう。
試しに Ruby でやってみた。
def fib(n)
a = b = 1
1.upto(n) do |i|
puts a
a, b = b, a + b
end
end
fib(ARGV[0].to_i)
takatoh@nightschool $ ruby fib.rb 100
1
1
2
3
5
8
13
21
34
(中略)
4660046610375530309
7540113804746346429
12200160415121876738
19740274219868223167
31940434634990099905
51680708854858323072
83621143489848422977
135301852344706746049
218922995834555169026
354224848179261915075
ちゃんと計算できてる! Ruby すげー!
