#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
有人可以帮我解决这个错误吗?我对此有点新意,所以请指导我!
答案 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)
在向量中找不到数字时始终终止循环。