如何创建一个Fibonacci数最多为某个整数n的数组?

时间:2014-09-23 18:28:54

标签: c++ arrays fibonacci

因此,对于作业,我被要求创建一个能够生成斐波纳契数列的函数,然后用户将提供一组随机数。然后我的函数必须检查用户输入的数组是否包含任何斐波纳契数,然后函数将输出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}

的纤维阵列

非常新的编程所以任何帮助将不胜感激!对不起,如果我的代码很糟糕。

2 个答案:

答案 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_ifbinary_search,加上一个lambda将它们粘合在一起,以找到两个容器之间的任何交叉点。

我在这里大量使用C ++ 11特性和大量抽象。如果您不了解某项功能,我建议您重写您不理解的部分,而不是盲目复制。

此代码具有运行时O(n lg lg n),这可能是过度的。 (fibs以指数方式增长。构建它们需要lg n次,搜索它们需要lg lg n次,然后我们会搜索n次。