2017-06-14 62 views
1

拋出段錯誤我沒有頭緒爲什麼這個函數輸出Segmentation faultn >= 128雙端隊列後128次迭代

顯然,這應該處理long long n輸出第一n斐波那契數之和的最後一位。

我不問一個解決方案,我知道有替代品!

我想知道的是爲什麼Segfault?我錯過了什麼嗎?這是我第一次處理deque btw。

#include <iostream> 
#include <deque> 

using namespace std; 

int fibonacci_sum_deque(long long n) { 
    if (n <= 2) 
    return n; 

    deque<int> sum(4); 
    sum[0] = 0; 
    sum[1] = 1; 
    sum[2] = 2; 

    for (long long i = 3; i <= n; ++i) { 
    sum[3] = (sum[2] + sum[1] + 1) % 10; 
    sum.pop_front(); 
    } 

    return sum[2]; 
} 

int main() { 
    long long n = 0; 
    cin >> n; 
    cout << fibonacci_sum_deque(n); 
} 

GDB輸出:

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000401861 in fibonacci_sum_deque(long long)() 
(gdb) where 
#0 0x0000000000401861 in fibonacci_sum_deque(long long)() 
#1 0x000000000040342d in main() 
+1

下的valgrind運行,如果你是在Linux上 – pm100

+9

您初始化雙端隊列4種元素和流行'正2'元素關閉 – Kevin

+0

@Kevin對不起,我什麼時候彈出第二個元素?我每次迭代都會彈出'n-1'元素。它可以很好地從'0'運行到'127' –

回答

3

您初始化sum有4個元素,絕不添加任何更多。但是你在sum.pop_front()n-2次。您可以初始化sumn元素或push_back這樣的新元素:

deque<int> sum(3); 
sum[0] = 0; 
sum[1] = 1; 
sum[2] = 2; 
for (long long i = 3; i <= n; ++i) { 
    sum.push_back((sum[2] + sum[1] + 1) % 10); 
    sum.pop_front(); 
} 
return sum[2]; 
+0

太棒了!它的工作,謝謝:)但是,看起來這種技術在'很長'的時候非常慢。 –

+0

@AssemAttia你可能會發現一個固定大小的數組,其索引當它碰到數組的末尾時會變換成比deque更快的方法,而不會改變整個算法(但不應該太多)。儘管你可以使用更快的算法。警告:我很肯定你現在算法中有一些不好的數學。檢查你的號碼。 – user4581301