C++ 如何创建斐波那契数不超过某个整数n的数组?
对于一个赋值,我被要求创建一个函数,它将生成一个斐波那契数数组,然后用户将提供一个随机数数组。然后,我的函数必须检查用户输入的数组是否包含任何斐波那契数,然后该函数将输出true,否则将输出false。我已经能够创建Fib数字的数组,并对照用户输入的数组进行检查,但是由于我的Fib数组的最大大小为100,因此它受到限制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] =
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);
}