我正在尝试创建一个用户输入数字的程序,然后将该数字输入到函数中,并输出该数字所在的Fibonacci序列的元素。
它给了我一个错误,上面写着
围绕变量'堆叠?被腐蚀了
我不知道这是逻辑错误还是程序错误。我也不知道我找到斐波纳契数的逻辑是否正确。
#include <iostream>
using namespace std;
int Fibonacci(int num)
{
int fib[] = { 0 }, answer, i = 3;
fib[1] = fib[2] = 1;
fib[0] = 0;
for (i = 3; i < num; i++)
{
fib[i] = fib[i - 2] + fib[i - 1];
}
answer = fib[num];
return answer;
}
int main()
{
int user_number, i = 0;
cin >> user_number;
cout << Fibonacci(user_number) << endl;
return 0;
}
答案 0 :(得分:0)
您只用一个元素定义fib
,因此发生缓冲区溢出。要修复它,您可以使用动态内存分配。将fib
定义为int*
(指向int的指针)并使用fib=malloc(sizeof(int)*num);
进行分配,并且不要忘记使用free(fib);
发布。或者,如果您的编译器支持C99,则可以使用可变长度数组。
并且有一个不需要数组的更好的算法。因为Fib(n)仅依赖于Fib(n-1)和Fib(n-2),所以可以使用两个变量来存储Fib(n-1)和Fib(n-2),而不存储先前的元素。
答案 1 :(得分:0)
1堆栈损坏很可能是因为你的数组
int fib[] = { 0 }
你已经声明了一个大小为1的int数组,然后在访问超出数组边界的数据之后立即
fib[1] = fib[2] = 1;
对于Fibonacci序列,使用递归特别容易实现;
int Fib(int var)
{
if (var < 1)
{
return 0;
}
else if (var == 1 || var == 2)
{
return 1;
}
else
{
return Fib(var-2)+Fib(var-1);
}
答案 2 :(得分:0)
你有一个主要问题,执行循环直到num - 1,你必须将它改为:
for (i = 3; i <= num; i++)
{
fib[i] = fib[i - 2] + fib[i - 1];
}
做完整的保证。也许你在初始化数组时遇到问题,你不必这样做,只需声明它:
int fib [num]; //the size is because num gonna be the last element of your array.