[英]c++ segmentation fault, why using "long long" I dont get an answer?
有人可以解釋這段代碼中的錯誤在哪里嗎? 因為當我使用這樣的參數 a=425 b=9631 n=9876543215 我得到“退出,分段錯誤代碼 139” :(
#include <iostream>
#include <iomanip>
using namespace std;
void ivedimas(long long &n, long long &a, long long &b);
long long fib(long long n, long long a, long long b);
void isvedimas(long long ats);
int main()
{
long long n,a,b;
ivedimas(n,a,b);
isvedimas(fib(n,a,b));
return 0;
}
void ivedimas(long long &n, long long &a, long long &b)
{
cin>>a>>b>>n;
}
long long fib(long long n,long long a, long long b)
{
long long c=b-a;
if (n==2)
return c;
return fib(n-1,b,c);
}
void isvedimas(long long ats)
{
cout<<ats<<endl;
}
堆棧溢出:每次函數調用自身時都會將其添加到堆棧中,因此此解決方案適用於小數,但任何太大的數都會失敗。
迭代解決方案:
long long fib(long long n, long long a, long long b)
{
if (n == 0) {return 0;}
if (n == 1) {return 1;}
long long t = 0;
long long j = 1;
for (int i = 2; i <= n; i++) {
int k = j;
j += t;
t = k;
}
return j;
}
斐波那契的這種遞歸版本不適用於大數。 每次它被稱為遞歸堆棧增加,直到結束從不減少。 因此,您只需在返回結果之前終止進程內存。
您可以嘗試迭代解決方案。
謝謝,這是解決方案:)) 序列中的每 6 個數字都是相同的 :) 例如 10,8,-2,-10,-8,2|10,8,-2,-10,-8, 2...
long long fib(long long n,long long a, long long b)
{ long long c=a;
if (n==0) return a;
if (n%6==1) return b;
for (int i=1;i<n%6;i++)
{
c=b-a;
a=b;
b=c;
}
return c;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.