获取斐波纳契数的索引

时间:2017-01-23 22:49:04

标签: c++

我是C ++的新手,几个月前我开始在大学里学习它。 我有一个功课来打印斐波那契数字的索引(如果是)或打印0(如果它不是)。但斐波那契有点不同。 F(n) = aF(n-1) + bF(n-2)。其中a和b来自输入。所以我继续输入:
1 1(那些是a和b)
4(是输入数字的长度)
13 14 9 5(确切数字)
。在这种情况下,这是常规的斐波那契序列。所以它必须打印:
7(fib(7)= 13)
0(14不是fib数)
0(9不是fib数)
5(fib(5)= 5)

限制因素是:
0< a,b< 100个
数量的计数< 10000
每个数字应在[0,1000000]范围内 我做了输出。它确实打印了索引,但没有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?

4 个答案:

答案 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";   
 }

答案 1 :(得分:0)

一个例子是“在Fibonacci序列中找到这个数字”是一个函数:

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;
}

答案 2 :(得分:-1)

您需要一种方法来指示找到匹配项,然后在循环结束后,如果未找到匹配项,则打印出0。

答案 3 :(得分:-1)

我觉得循环中这个硬编码的数字30是不正确的,因为如果A或B是80,例如这不起作用?