C++ 如何创建斐波那契数不超过某个整数n的数组?

C++ 如何创建斐波那契数不超过某个整数n的数组?,c++,arrays,fibonacci,C++,Arrays,Fibonacci,对于一个赋值,我被要求创建一个函数,它将生成一个斐波那契数数组,然后用户将提供一个随机数数组。然后,我的函数必须检查用户输入的数组是否包含任何斐波那契数,然后该函数将输出true,否则将输出false。我已经能够创建Fib数字的数组,并对照用户输入的数组进行检查,但是由于我的Fib数组的最大大小为100,因此它受到限制 bool hasFibNum (int arr[], int size){ int fibarray[100]; fibarray[0] = 0; fibarray[1] =

对于一个赋值,我被要求创建一个函数,它将生成一个斐波那契数数组,然后用户将提供一个随机数数组。然后,我的函数必须检查用户输入的数组是否包含任何斐波那契数,然后该函数将输出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;
}
bool hasFibNum(int arr[],int size){
int-fibarray[100];
fibarray[0]=0;
fibarray[1]=1;
布尔结果=假;
对于(int i=2;i<100;i++)
{
fibarray[i]=fibarray[i-1]+fibarray[i-2];
}
对于(int i=0;i
所以基本上,我怎样才能做到不必使用int-fibarray[100],而是在某一点上生成fib数。该点是用户数组中的最大数

例如,如果用户输入数组{4,2,1,8,21},我需要生成一个数字为21{1,1,2,3,5,8,13,21}的fibarray。如果用户输入数组{1,4,10},我需要用{1,1,2,3,5,8,13}生成一个fibarray


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

我可能仍然不理解您的问题,但如果我理解了,那么我会像这样实现您想要的:

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;
}
bool hasFibNum(int arr[],int size){
如果(size==0)返回false;
int maxValue=arr[0];
对于(int i=1;imaxValue)maxValue=arr[i];
}
int first=0;
int秒=1;
while(秒<最大值)
{
对于(int i=0;i
这里有一个函数,它返回一个动态数组,其中包含所有小于等于
max
(假设
max>0

在这里,我创建了一个模板函数,它将(固定大小的)数组作为引用。这样做的好处是,基于范围的循环将在其上工作

接下来,我使用
std
算法
max\u元素
来查找max元素

最后,我使用两种
std
算法,
find_if
binary_search
,加上一个lambda将它们粘在一起,以查找两个容器之间的任何交点

我在这里大量使用C++11特性和大量抽象。如果你不懂一个函数,我建议你重写你不懂的部分,而不是盲目复制


这段代码有运行时
O(n lg n)
,这可能有点过头了。(fib呈指数增长。构建它们需要
lg n
时间,搜索它们需要
lg n
时间,然后我们搜索
n
次)。

在用户的数组中循环查找最大数量,然后创建达到该数量的fib编号。这就是你们所要求的解决方案吗?我很难理解你的问题是的,如果我的措辞让理解变得有点复杂,很抱歉。但这正是我需要做的。你的意思是如果用户输入
{1,4,10}
,你就必须生成一个最多
10
的fib数组,因为
10
是最大的?当我假设你的数组会上升到
13
时,你的数组会上升到
8
。10不是斐波那契数,第二个生成的数组是斐波那契数的数组。{1,4,10}不要使用静态数组,而是使用一个向量,您可以根据需要向其添加任意多的元素。我们只允许使用。可能有几十种其他方法可以更有效地实现这一点,但我们还没有被引入向量库。是的!这太完美了!非常感谢你的帮助,非常感谢。希望我能以某种方式回报你。这是
O(n*lgn)
,我想这还不错。(fib呈指数增长)可以通过改进内存局部性来反转底部循环(对于每个值,检查每个fib,而不是检查每个fib的每个值),从而加快速度,如果您关心这类事情的话。
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;
}
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);
}