- 締切済み
フィボナッチ数列 C言語プログラミング
フィボナッチ数列について、 プログラミングが得意な方、お願いします! F(0)=0, a(1)=1, F(n+2)=F(n+1)+F(n) (n>=0) 「xを入力し、 S(k)>=xを満たす最小のk及びF(k)の値を表示し、更にその値をファイルに記録する」 非常に勝手ですが、早めにお願いします!><
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
こんな回答したらダメなんだろうか? S(k) は勝手に解釈した。 #include <stdio.h> int F(int k) { if (k == 0) return 0; if (k == 1) return 1; return F(k - 1) + F(k - 2); } int S(int k) { if (k <= 0) return 0; return F(k) + S(k - 1); } int main() { int x; int k; scanf("%d", &x); for(k = 0; S(k) < x; k++); printf("x = %d , k = %d and F(x) = %d", x, k, F(k)); return 0; }
- hitomura
- ベストアンサー率48% (325/664)
こんな感じでどうでしょう。 # 半分ほど#1さんの回答を参考にしています。 #include <stdio.h> #include <math.h> /* もっと大きな結果が求められる範囲がほしければこの型と書式指定を変更する */ typedef long FibType; #define FIB_TYPE_FORMAT "%ld" FibType fib(int n) { return (FibType)((pow((1 + sqrt(5.0)) / 2, (double)n) - pow((1 - sqrt(5.0)) / 2, (double)n))/ sqrt(5.0) + 0.5); } int main(void) { FibType result, x; int num; char format_buf[100]; printf("xの値を入力してください:"); scanf(FIB_TYPE_FORMAT, &x); if (x < 0) { printf("\nError!! (x < 0)\n"); exit(1); } num = -1; do { num++; }while ((result = fib(num)) < x); sprintf(format_buf, "\n結果: k = %%d, F(%%d) = %s\n", FIB_TYPE_FORMAT); printf(format_buf, num, num, result); /* ファイルへの出力処理をここに書く */ return 0; }
- Tacosan
- ベストアンサー率23% (3656/15482)
これは 「S(k) が与えられていないので計算できません」 という答を期待しているというひっかけ問題かもしれん.
- a_kwn
- ベストアンサー率34% (8/23)
ファイルに記録する部分は、仕様がよくわからんから飛ばしました。 実行速度とここに書く返答の速度に拘ってみました:-P #include <stdio.h> long Fn[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, }; int main(void) { long k, x, num, fn_max; num = sizeof(Fn) / sizeof(Fn[0]); fn_max = Fn[num - 1]; printf("x (0~%u):>", fn_max); scanf("%ld", &x); if (x < 0) { printf("\nError!! (x < 0)\n"); } else if (x > fn_max) { printf("\nError!! (x > %ld)\n", fn_max); } else { for (k = 0; k < num; k++) { if (x <= Fn[k]) { printf("Result: k=%ld, F(%ld)=%ld\n", k, k, Fn[k]); /* ここに、ファイルへの出力を書く */ break; } } } return 0; }