前提・実現したいこと
c言語を始めたばかりの初心者です。
フィボナッチ数列の変形版についてのプログラムを書いています。
問題は以下の通りです。
数列f(n)を
f(0) = 3, f(1) = 0, f(2) = 2, f(n) = f(n-2) + f(n-3) (n>2)
と定義する。
n>1かつf(n)がnで割り切れるような整数nのうち、32番目に小さいnをkとする。
k, f(k)の値を出力せよ。
ex. 8番目に小さいnは19で, f(19) = 209.
この問題に対して再帰関数を用いようと思いましたが時間効率が悪いと知ったので、再帰を用いずに該当のソースコード(下に記す)を書きました。しかし、得られた出力(下に記す)が明らかに誤っています(nが負になっている)。
原因の分かる方がいたらご教授お願い致します。
該当のソースコード
C
1#include <stdio.h> 2#define TARGET 32 3 4int main(){ 5 long f0=3, f1=0, f2=2, fn; 6 int n, cnt=1; //n=2の時、f(2)=2で条件を満たすので予めcntを1にする 7 for(n=3; ; n++){ 8 fn = f1 + f0; 9 if(fn % n == 0) cnt++; 10 if(cnt >= TARGET){ 11 printf("%d %ld\n", n, fn); 12 break; 13 } 14 f0 = f1; 15 f1 = f2; 16 f2 = fn; 17 } 18 return 0; 19} 20
###得られた出力
-27355683 1231005735
試したこと
TARGETを8に変えて実行すると、exの通り 19 209 と出力される。
補足情報(FW/ツールのバージョンなど)
実行環境はWindows, VSCode
gccでコンパイル。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/25 10:48
2020/11/25 11:35
2020/11/25 12:08
2020/11/25 12:18 編集
2020/11/25 12:33 編集
2020/11/25 12:35