2017-06-14 73 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