1

私は C++ プログラミングが初めてで、少し迷っています。これが私がやろうとしていることと私のコードです。何をすべきかについてのアイデアはありますか?

while ループを使用して最初の n 個のフィボナッチ数を計算するプログラムを作成します。フィボナッチ数列の次の定義を数学から思い出してください。

フィボナッチ数 Fn は次のように定義されます。F0 は 1、F1 は 1 で、i = 0、1、2、... の場合、Fi+2 = Fi + Fi+1 です。つまり、各数値は前の 2 つの数値の合計です。最初のいくつかのフィボナッチ数は、1、1、2、3、5、8、および 13 です。

プログラムは、ユーザーに n (フィボナッチ数の数) の入力を求め、結果を画面に出力する必要があります。ユーザーが n に無効な値 (n <= 0) を入力した場合、エラー メッセージを出力し、ユーザーに n を再入力するように求めます (n の入力検証ループ)。これは、ラボ 2 のような if ステートメントではなく、ループでなければなりません。

出力は次のようになります。

計算するフィボナッチ数の数を入力してください: 3 最初の 3 つのフィボナッチ数: 1 1 2

#include <iostream>
using namespace std;
int main()
{
    int f0 = 0, f1  = 1,f2= 2, i = 0, n;
    cout << "Enter the number of Fibonacci numbers to compute: ";
    cin >> n;
    if ( n <= 0)
    {
        cout <<"Error: Enter a positive number: ";
        return 1;
    }
    while ( i < n){
        f2 = f0 + f1;
        i++;
    }

    cout << "The first " << n << " Fibonacci numbers are: " << endl;
    cin >> n;
    return 0;
}
4

5 に答える 5

2
 while ( i < n){
        f2 = f0 + f1;
        i++;
    }

このループを見てください。これが問題の場所です。これは宿題なので、問題が何であるかは正確にはわかりません。ペンと紙を用意して、ステートメントの実行を開始します。特にこのループで、エラーが見つかります。ヒントとして、フィボナッチ数は前の 2 つのフィボナッチ数の合計です。

于 2011-09-28T16:12:23.040 に答える
0

ウィキペディアによると、あなたの定義はオフです。F0 = 0、F1 = 1、F2 = 1、F3 = 2、..。

http://en.wikipedia.org/wiki/Fibonacci_number

ウィキペディアが正しいと仮定すると、あなたのループは基本的に

int i = 0, f, fprev;
while( i < n )
{
    if( i == 0 )
    {
        f = 0;
        fprev = 0;
    }
    else if( i == 1 )
    {
        f = 1;
    }
    else
    {
        int fnew = f + fprev;
        fprev = f;
        f = fnew;
    }
    i++;
}
于 2011-09-28T16:17:06.657 に答える
0

他の人が指摘しているように、ループ内で変更することは決してないためf0f1ループf2の回数に依存することはありません。とにかく最後にすべての数値を出力する必要があるため、それらを配列に保持してみませんか。最初の 2 つの値を手動で初期化し、十分な値が得られるまでループします。

(これは、STL を使用して非常にうまく行うことができます。

//  After having read n...
std::vector<int> results( 2, 1 );
while ( results.size() < n )
    results.push_back( *(results.end() - 1) + *(results.end() - 2));

ただし、これがあなたのインストラクターが探しているものかどうかはわかりません。むしろ、彼はあなたに自分で索引を付けてほしいと思っているのではないかと思います。最初の 2 つの値を手動で初期化する場合、インデックスは 0 ではなく 2 から開始する必要があることに注意してください)。

別のこと:あなたが投稿した仕様では、ユーザーが不正な値を入力した場合はループする必要があると書かれています。これは実際には少し注意が必要です: ユーザーがint(「abc」など) ではないものを入力すると、1) std::cinクリアされるまでエラー状態のままになります (それ以降のすべての入力は失敗します) std::cin.clear()。文字はストリームから抽出されないため、それらを削除するまで次の試行は失敗します。(これには を使用>>することを お勧めstd::stringします。これにより、次の空白まですべてが削除されます。)そして、変数にアクセスしないください。>>入力が失敗した場合は、ストリームの失敗をチェックするまで入力を続けます。入力が失敗した場合、入力されている変数は変更されません。ここのように、初期化していない場合は、何かが起こる可能性があります。

最後に (そして、これはあなたの割り当てを超えていると確信しています)、オーバーフローをチェックするために何かをする必要があります。特定のポイントを超えると、出力は多かれ少なかれランダムになります。この場合は、あきらめていることを停止して出力することをお勧めします。

于 2011-09-28T17:03:33.930 に答える
0

あなたはf2=f0+f1権利を得ました。iただし、 をインクリメントすると、 にf2なりf1、にf1なることに注意してくださいf0

次のように名前を付けると、より理にかなっています。

int f_i_minus_2 = 0, f_i_minus_1 = 1, f_i;

そして、あなたは持っているでしょう

f_i = f_i_minus_1+f_i_minus_2;

さて、想像iは 3 です。あなたは次のように書いています。

f[3] = f[2]+f[1]

をインクリメントする場合i、以下が必要です。

f[4] = f[3]+f[2]

それはf_iの場所にf_i_minus_1置かf_i_minus_1れ、 の場所に置かれf_i_minus_2ます。

(これを見てください:

f[3] = f[2] + f[1]
 |       |
  \_____  \____
        \      \
f[4] = f[3] + f[2]

)

したがって、計算後に 2 つの代入が必要ですf_i

f_i_minus_2 = f_i_minus_1;
f_i_minus_1 = f_i;

2 番目の代入が の値を破壊するため、最初に に変更f_i_minus_2したことに注意してください。f_i_minus_1f_i_minus_1

于 2011-09-28T16:12:50.217 に答える
0

興味がある場合は、それを計算するためのより良い方法があります。

于 2011-09-28T16:20:01.627 に答える