2017-01-23 2 views
-1

Я новичок в C++, и я начал изучать его в университете несколько месяцев назад. У меня есть домашняя работа, чтобы напечатать индекс числа фибоначчи (если он есть) или напечатать 0 (если это не так). Но fibonacci немного отличается. F(n) = aF(n-1) + bF(n-2). Где a и b даны на входе. Так я продолжая вход:
1 1 (те, а и б)
4 (длина чисел вводится)
13 14 9 5 (точные цифры)
. В этом случае это регулярная последовательность фибоначчи. Так что нужно напечатать:
7 (FIB (7) = 13)
0 (14 не является числом FIB)
0 (9 не является числом FIB)
5 (FIB (5) = 5)
Получить индекс числовой номер фибоначчи

ограничения являются:
а, б подсчет чисел и каждый номер должен быть в диапазоне [0, 1 миллион]

я сделал вывод. Он действительно печатает мне индексы, но без 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; 
} 

Как распечатать 0s там?

+0

Вы должны провести некоторое исследование чисел Фибоначчи. Существует замкнутая формула для номера nn Фибоначчи. Другими словами, вы просто вставляете '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, например, это не работает?

Смежные вопросы