验证一个数字是否是斐波那契

时间:2014-12-18 15:59:34

标签: c++ fibonacci

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int fib0 = 0;
    int fib1 = 1;

    long long t;
    cin >> t;
    vector<long long> vec;
    //int count=0;
    vec.push_back(fib0);
    //count++;
    vec.push_back(fib1);
    //count++;
    long long sizeval=0;
    for(long long i=0;i<t;i++)
    {


        long long n;
        cin >> n;
        sizeval= vec.size();
       // cout << sizeval <<endl;
       // cout << vec.at(sizeval-1)<<endl;

        if(vec.at(sizeval-1)<n)
        {
            while(vec.at(sizeval-1)<n)
            {
              //  long long temp1=vec.at(sizeval-1);   //fib_n2
                //long long temp2=vec.at(sizeval-2);  //fib_n1
                long long temp=vec.at(sizeval-1)+vec.at(sizeval-2);
                vec.push_back(temp);
              //  cout << temp << endl;
                sizeval= vec.size();
               // cout << sizeval << endl;
            }
            if(vec.at(sizeval-1)==n)
            {
                cout << "IsFibo"<<endl;
            }
            else
            {
                cout << "IsNotFibo"<<endl;
            }

        }
        else if(vec.at(sizeval-1)==n || vec.at(0)==n)
        {
            cout << "IsFibo" <<endl;
        }
        else
        {
            int found=0;
            long long k=0;
            long long l=vec.size()-1;
            while(k!=l)
            {


            long long mid = (k+l)/2;

            if(n==vec.at(mid))
            {
                cout << "IsFibo" << endl;
                found=1;
                break;

            }
            else if(n>vec.at(mid))
            {
                k=mid;
                l--;

            }
            else
            {
                l=mid;
                k++;
            }
            if(vec.at(k)==n || vec.at(l)==n)
                {
                    cout << "IsFibo" << endl;
                    found=1;
                    break;
                }
        }
        if(found==0)
        {
            cout << "IsNotFibo" << endl;
        }
        }

    }
          return 0;
}

如果数字是Fibonacci序列的一部分,我的代码应该打印“IsFib”,如果不是,则打印“IsNotFib”。问题是,有时在执行它时,我收到此错误:

'std::out_of_range' what(): vector::_M_range_check

有人可以帮我解决这个错误吗?我对此有点新意,所以请指导我!

3 个答案:

答案 0 :(得分:1)

我还没有完全遵循你的代码,但是这个错误意味着你要么超出它的结束,要么在它开始之前访问它。

不是将向量的大小保存在整数中,而是使用std :: vector :: iterator来跟踪向量中的位置,然后使用vec.begin()作为其开头,并使用vec.end ()对于一个过去的向量结束:

std::vector::iterator mark( vec.begin() );

if ( mark >= vec.begin() && mark < vec.end() )
   // You're looking inside the vector
else
   // you're before the beginning or past the end.

我稍后会再次查看您的代码。

答案 1 :(得分:1)

你只需要记忆两个数字来计算斐波纳契。如果你获得的价值高于你想要的价值,那不是斐波那契数字:

long t;
std::cin >> t;
long cur = 1;
long prev = 0;

while (cur < t) {
    long next = cur + prev;
    prev = cur;
    cur = next;
}

if (cur == t || t == 0)
    std::cout << " is fib" << std::endl;
else
    std::cout << " is NOT fib" << std::endl;

编辑:现在,假设我正确理解你的评论,如果你想只检查斐波那契序列的第一个steps数字:

long t;
std::cin >> t;
long cur = 1;
long prev = 0;
int steps;
std::cin >> steps;

while (cur < t && steps-- > 0) {
    long next = cur + prev;
    prev = cur;
    cur = next;
}

if ((cur == t || t == 0) && steps >= 0)
    std::cout << " is fib" << std::endl;
else
    std::cout << " is NOT fib" << std::endl;

答案 2 :(得分:0)

更改

while(k!=l)

while(k<l)

在向量中找不到数字时始终终止循环。