dポイントプレゼントキャンペーン実施中!

1,1,2,3,5,8,13,21・・・と増えていく数列の500以下の範囲の合計を出すプログラムのソースが読めなくて困っています。(1)(2)(3)(4)の部分の意味がわかりません。ご教示頂けましたら助かります。
宜しくお願い致します。

#include <stdio.h>
int main() {
int a[1000] = {0,1}; //(1) なぜ、0,1??
int tmp,tmp1, ans;
for (tmp = 1;a[tmp] <= 500;tmp++) //(2)
a[tmp + 1] = a[tmp] + a[tmp -1]; //(3)

//tmp,tmp1がどういう役割をしているのか、わかりません。

for (ans = 0,tmp1 = 1;tmp1<tmp; tmp1++) { //(4)
ans = ans + a[tmp1];
printf("%d \n",a[tmp1]);
}
printf("%d",ans);
return 0;
}

A 回答 (2件)

> 1,1,2,3,5,8,13,21,...


がフィボナッチ数列である事が分かっていれば、そんなに難しくないと思います。
フィボナッチ数列の漸化式は、
a(0) = 0, a(1) = 1
a(n+1) = a(n-1) + a(n)
ですので、上式が(1)、下式が(3)を記述してます。
漸化式の添字をループ変数として記述してるが、tmp1とtmpです。
(2)は、問題の制約条件から、500までと書かれているのがコード化されてます。
(2)(3)で、数列を予め求めておいて、(4)でそれを合計して、問題を解決してます。この時、変数temp1を使い回して、合計を求めるための配列アクセス用インデックス変数としてます。分かりにくかったら、別変数tmp2を使って記述してもよいと思います。
    • good
    • 0
この回答へのお礼

早速のご回答、誠にありがとうございます。
大変わかりやすい解説を頂き理解できました。
大変助かりました。

お礼日時:2006/11/05 16:14

> 1,1,2,3,5,8,13,21・・・と増えていく数列


フィボナッチ数列ですね。
(というか、何でフィボナッチ数列という言葉を使わないんだろう?)

> int a[1000] = {0,1}; //(1) なぜ、0,1??
フィボナッチ数列の定義、F(n+2)=F(n+1)+F(n)に従って計算するのに
最初の2項が必要だからでしょうね。
でも0,1じゃなくて、1,1で良い気がするけど。最初の0はどうせ使わないし。

tmpとtemp1はforループのカウンタです。
tmpは(2)のforループを抜けたとき、500を超える最初の項の配列番号になっていることが分かれば、
(4)でtmpを使っている理由も分かります。

(3)はフィボナッチ数列の定義そのままの計算です。
    • good
    • 0
この回答へのお礼

早速のご回答、誠にありがとうございます。
大変わかりやすい解説を頂き理解できました。
大変助かりました。

お礼日時:2006/11/05 16:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!