2017-06-14 3 views
1

Ich habe keine Ahnung, warum diese Funktion Segmentation fault ausgibt, wenn n >= 128deque wirft Segfault nach 128 Iterationen

Offenbar dies sollte long long n zur Ausgabe der letzte Ziffer der Summe der ersten n Fibonacci-Zahlen behandeln.

Ich frage nicht nach einer Lösung, ich weiß, es gibt Alternativen!

Alles, was ich wissen will ist, warum der Segfault? Fehle ich etwas? Es ist mein erstes Mal, mit deque BTW umzugehen.

#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 Ausgang:

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

Lauf unter valgrind, wenn Sie auf Linux sind – pm100

+9

Sie die deque mit 4 Elementen initialisieren und Pop 'n-2' Elemente aus – Kevin

+0

@ Kevin Entschuldigung, wann habe ich das zweite Element veröffentlicht? Ich knalle 'n-1' Element pro Iteration. Es funktioniert gut von "0" bis "127" –

Antwort

3

Sie initialisieren sum mit 4 Elementen und nie mehr hinzuzufügen. Aber Sie tun sum.pop_front() in einer Schleife mal. Sie können entweder initialisieren sum mit n Elementen oder push_back ein neues Element wie folgt aus:

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

Super! Es hat funktioniert, danke :) Wie auch immer, es sieht so aus, als wäre die Technik bei 'long long n' so langsam. –

+0

@AssemAttIa Sie können ein Array fester Größe mit einem Index finden, der umgeht, wenn er das Ende des Arrays erreicht, um schneller zu sein als die Deque, ohne den Gesamtalgorithmus zu ändern (sollte aber nicht viel sein). Es gibt schnellere Algorithmen, die Sie jedoch verwenden können. Eine Warnung: Ich bin mir ziemlich sicher, dass Sie im Moment eine schlechte Mathematik im Algorithmus haben. Überprüfen Sie Ihre Zahlen. – user4581301