2017-01-23 6 views
-1

私はC++の新人です。数ヶ月前に大学で学び始めました。 私はフィボナッチ数(もしあれば)のインデックスを印刷するか、または0をプリントするという宿題を持っています。しかし、フィボナッチは少し違っています。 F(n) = aF(n-1) + bF(n-2)。 aとbは入力から与えられます。私は入力に連続しています:
1(ものであり、b)は、
4は
13 14 9 5(正確な数)
(入力された数字の長さです)。この場合、これは通常のフィボナッチ配列です。それは印刷しなければならない:
7(FIB(7)= 13)
0(14 FIB番号ではない)
0(9 FIB番号ではない)
5(FIB(5)= 5)
フィボナッチ数のインデックスを取得

制約がある:番号10000
<及び各番号の
、B カウント値が範囲内にあるべきである[0、1000000]

Iが出力を行いました。それは本当に私にインデックスを印刷しますが、0は含みません。わずか7と5です:

#include <iostream> 
#include <vector> 
using namespace std; 
int a,b; 

int fib(int n) 
{ 

    if (n <= 1) 
     return n; 
    return a*fib(n-1) + b*fib(n-2); 
} 


int main() 
{ 
    int length; 
    vector<int> v; 
    int number; 
    while (cin >> a >> b >> length) 
    { 
     for (int i = 0; i < length; i++) 
     { 
      cin >> number; 
      v.push_back(number); 
     } 

     for (int i = 0; i < v.size(); i++) 
     { 
      for (int j = 0; j <= 30; j++) // 30 is max because 31 is beyond 1.000.000 
      { 
       if (v[i] == fib(j)) 
       { 
        cout << j << endl; 
       } 
      } 
     } 
     v.clear(); 
    } 
    return 0; 
} 

ここに0を印刷するにはどうすればよいですか?

+0

フィボナッチ数についていくつかの調査を行う必要があります。フィボナッチ数のn番目の式は閉じられています。言い換えれば、あなたは単に 'n'を差し込み、すぐに答えを吐き出します。これを使用してソリューションに役立つかもしれません。 –

答えて

0

一例をプリントアウトされたことを示すための方法が必要ですフィボナッチ数列」機能:

int get_index(int v) 
{ 
    for (int j = 0; j <= 30; j++) // 30 is max because 31 is beyond 1.000.000 
    { 
     if (v == fib(j)) 
     { 
      return j; 
     } 
    } 
    return 0; 
} 

ノーリターンがループでなかった場合、我々は、関数の最後に0を返します。その後

このように、あなただけの、あなたのメインのコードでそれを使用します。

 for (int i = 0; i < v.size(); i++) 
     { 
      cout << get_index(v[i]) << endl; 
     } 

ここでは、完全なコードです:

#include <iostream> 
#include <vector> 
using namespace std; 
int a,b; 

int fib(int n) 
{ 

    if (n <= 1) 
     return n; 
    return a*fib(n-1) + b*fib(n-2); 
} 

int get_index(int v) 
{ 
    for (int j = 0; j <= 30; j++) // 30 is max because 31 is beyond 1.000.000 
    { 
     if (v == fib(j)) 
     { 
      return j; 
     } 
    } 
    return 0; 
} 

int main() 
{ 
    int length; 
    vector<int> v; 
    int number; 
    while (cin >> a >> b >> length) 
    { 
     for (int i = 0; i < length; i++) 
     { 
      cin >> number; 
      v.push_back(number); 
     } 

     for (int i = 0; i < v.size(); i++) 
     { 
      cout << get_index(v[i]) << endl; 
     } 
     v.clear(); 
    } 
    return 0; 
} 
1
for (int i = 0; i < v.size(); i++) 
    { 
     bool flag = true; 
     for (int j = 0; j <= 30; j++) // 30 is max because 31 is beyond 1.000.000 
     { 
      if (v[i] == fib(j)) 
      { 
       flag = false; 
       cout << j << endl; 
      } 
     } 
     if(flag) cout << "0\n"; 
} 
+0

これが最速の方法でした。それがうまくいった速い反応をありがとう – user7460099

-1

あなたが一致するものが見つかると、一致が見つからなかった場合は、ループが終了した後、その後、「作るにはこの番号を見つけることであろう0

-1

私はループでこのハードコーディングされた数30のように感じますAやBが80の場合、これは機能していないため、正しくありませんか?

関連する問題