C 如何修复SIGSEGV?(处理斐波那契数列中高达1000000的大值时出错)
试图开发一个快速查找斐波那契值的代码。 但问题是当输入的顺序为1000000时,我得到了SIGSEGV错误。 另外,从这里的其他问题中,我了解到这可能是因为堆栈内存在运行时超过了限制。我想这里就是这样C 如何修复SIGSEGV?(处理斐波那契数列中高达1000000的大值时出错),c,fibonacci,segmentation-fault,C,Fibonacci,Segmentation Fault,试图开发一个快速查找斐波那契值的代码。 但问题是当输入的顺序为1000000时,我得到了SIGSEGV错误。 另外,从这里的其他问题中,我了解到这可能是因为堆栈内存在运行时超过了限制。我想这里就是这样 #include<stdio.h> unsigned long long int a[1000001] = {0}; unsigned long long int fib(int n) { unsigned long long int y; if(n==1 || n==
#include<stdio.h>
unsigned long long int a[1000001] = {0};
unsigned long long int fib(int n)
{
unsigned long long int y;
if(n==1 || n==0)
return n;
if (a[n] != 0)
return a[n];
else
{
y=fib(n-1)+fib(n-2);
a[n] = y;
}
return y;
}
main()
{
int N;
unsigned long long int ans;
a[0] = 1;
a[1] = 1;
scanf(" %d",&N);
ans = fib(N+1);
printf("%llu",ans);
}
#包括
无符号长整型a[1000001]={0};
无符号长整型fib(整型n)
{
无符号长整型;
如果(n==1 | | n==0)
返回n;
如果(a[n]!=0)
返回一个[n];
其他的
{
y=fib(n-1)+fib(n-2);
a[n]=y;
}
返回y;
}
main()
{
int N;
无符号长整型;
a[0]=1;
a[1]=1;
scanf(“%d”和“&N”);
ans=fib(N+1);
printf(“%llu”,ans);
}
如何修复输入值为1000000的代码?使用您自己的变量来跟踪状态,而不是使用堆栈。本质上,使用您自己的代码执行函数调用和返回
最好的方法就是把算法完全转换成一个高效的算法。例如,要计算fib(6),您的代码计算fib(4)两次,一次在fib(5)请求时,一次在fib(6)请求时。使用您自己的变量跟踪状态,而不是使用堆栈。本质上,使用您自己的代码执行函数调用和返回 最好的方法就是把算法完全转换成一个高效的算法。例如,要计算fib(6),您的代码将计算fib(4)两次,一次在fib(5)询问时计算,一次在fib(6)询问时计算。这里有一个更好的方法(仍然可以显著改进)可以为您计算Fibonacci数:
unsigned long long Fibonacci(int n)
{
unsigned long long last[2] = { 0, 1 }; // the start of our sequence
if(n == 0)
return 0;
for(int i = 2; i <= n; i++)
last[i % 2] = last[0] + last[1];
return last[n % 2];
}
无符号长斐波那契(int n)
{
无符号long last[2]={0,1};//序列的开始
如果(n==0)
返回0;
对于(int i=2;i,这里有一个更好的方法(仍然可以显著改进)可以为您计算斐波那契数:
unsigned long long Fibonacci(int n)
{
unsigned long long last[2] = { 0, 1 }; // the start of our sequence
if(n == 0)
return 0;
for(int i = 2; i <= n; i++)
last[i % 2] = last[0] + last[1];
return last[n % 2];
}
无符号长斐波那契(int n)
{
无符号long last[2]={0,1};//序列的开始
如果(n==0)
返回0;
对于(int i=2;我让它迭代,让它迭代。