双端队列后128次迭代
抛出段错误我没有头绪为什么这个函数输出Segmentation fault
时n >= 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()
您初始化sum
有4个元素,绝不添加任何更多。但是你在sum.pop_front()
环n-2
次。您可以初始化sum
与n
元素或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];
太棒了!它的工作,谢谢:)但是,看起来这种技术在'很长'的时候非常慢。 –
@AssemAttia你可能会发现一个固定大小的数组,其索引当它碰到数组的末尾时会变换成比deque更快的方法,而不会改变整个算法(但不应该太多)。尽管你可以使用更快的算法。警告:我很肯定你现在算法中有一些不好的数学。检查你的号码。 – user4581301
下的valgrind运行,如果你是在Linux上 – pm100
您初始化双端队列4种元素和流行'正2'元素关闭 – Kevin
@Kevin对不起,我什么时候弹出第二个元素?我每次迭代都会弹出'n-1'元素。它可以很好地从'0'运行到'127' –