因此,对于作业,我被要求创建一个能够生成斐波纳契数列的函数,然后用户将提供一组随机数。然后我的函数必须检查用户输入的数组是否包含任何斐波纳契数,然后函数将输出true,否则它将输出false。我已经能够创建Fib数字数组,并根据用户输入的数组进行检查,但由于我的Fib数组的最大大小为100,因此它是有限的。
bool hasFibNum (int arr[], int size){
int fibarray[100];
fibarray[0] = 0;
fibarray[1] = 1;
bool result = false;
for (int i = 2; i < 100; i++)
{
fibarray[i] = fibarray[i-1] + fibarray[i-2];
}
for (int i = 0; i < size; i++)
{
for(int j = 0; j < 100; j++){
if (fibarray[j] == arr[i])
result = true;
}
}
return result;
}
所以基本上我怎样才能做到这一点,以便我不必使用int fibarray [100],而是可以生成最多到某一点的fib数。这一点是用户数组中的最大数量。
因此,例如,如果用户输入数组{4,2,1,8,21},我需要生成一个最大数为21 {1,1,2,3,5,8,13的纤维阵列, 21}。如果用户输入数组{1,4,10},我需要生成{1,1,2,3,5,8,13}
的纤维阵列非常新的编程所以任何帮助将不胜感激!对不起,如果我的代码很糟糕。
答案 0 :(得分:1)
我可能仍然不理解你的问题,但如果我这样做,那么我会达到你想要的效果:
bool hasFibNum (int arr[], int size){
if (size == 0) return false;
int maxValue = arr[0];
for (int i = 1; i < size; i++)
{
if (arr[i] > maxValue) maxValue = arr[i];
}
int first = 0;
int second = 1;
while (second < maxValue)
{
for (int i = 0; i < size; i++)
{
if (arr[i] == first) return true;
if (arr[i] == second) return true;
}
first = first + second;
second = second + first;
}
return false;
}
答案 1 :(得分:1)
这是一个函数,它返回一个动态数组,其中包含所有Fibonacci数,包括max
(假设为max > 0
)
std::vector<size_t> make_fibs( size_t max ) {
std::vector<size_t> retval = {1,1};
while( retval.back() < max ) {
retval.push_back( retval.back()+*(retval.end()-2) );
}
return retval;
}
我预先填充了2个元素,而不是分别跟踪最后2个元素。
请注意,根据某些定义,0
和-1
是斐波那契数字。如果您正在使用它,请使用{-1, 0, 1}
启动数组(这不是他们的订单,实际上是-1, 1, 0, 1
,但是按照升序保留它们我们可以binary_search
以下)。如果您这样做,请将类型更改为int
而不是size_t
。
接下来,has_fibs
的实施草图:
template<class T, size_t N>
bool has_fibs( T(&array)[N] ) {
// bring `begin` and `end` into view, one of the good uses of `using`:
using std::begin; using std::end;
// guaranteed array is nonempty, so
T m = *std::max_element( begin(array), end(array) ); will have a max, so * is safe.
if (m < 0) m = 0; // deal with the possibility the `array` is all negative
// use `auto` to not repeat a type, and `const` because we aren't going to alter it:
const auto fibs = make_fibs(m);
// d-d-d-ouble `std` algorithm:
return std::find_if( begin(array), end(array), [&fibs]( T v )->bool {
return std::binary_search( begin(fibs), end(fibs), v );
}) != end(array);
}
这里我创建了一个模板函数,它将您的(固定大小)数组作为参考。这样做的好处是基于范围的循环可以在它上面工作。
接下来,我使用std
算法max_element
来查找最大元素。
最后,我使用两个std
算法,find_if
和binary_search
,加上一个lambda将它们粘合在一起,以找到两个容器之间的任何交叉点。
我在这里大量使用C ++ 11特性和大量抽象。如果您不了解某项功能,我建议您重写您不理解的部分,而不是盲目复制。
此代码具有运行时O(n lg lg n)
,这可能是过度的。 (fibs以指数方式增长。构建它们需要lg n
次,搜索它们需要lg lg n
次,然后我们会搜索n
次。