Nty wyraz fibonacci

Nty wyraz fibonacci
N1
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:5
0

Witam,
Męczę się z tym zadaniem już trochę czasu liczę na jakieś rady:

Napisz algorytm obliczania n-ty wyraz ciągu Fibonacciego. Wejście: liczba naturalna n Wyjście: n-ty wyraz ciągu Fibonacciego.
Należy napisać algorytm, który działa w czasie O(logn). Dodatkowe wymaganie to: Program powinien wczytywać wartość n z konsoli.

Zrobiłem coś takiego, no ale są błędy w kompilacji. Liczę na pomoc.

edit: kod jest niepoprawny

edytowany 2x, ostatnio: Neron101
lion137
Sformatuj kod.
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 3 godziny
  • Postów:4935
2

To jest Fibonacci? Nie wygląda:) Żeby mieć ~logn Musisz użyć algebry, mnożenie macierzy.
https://en.wikipedia.org/wiki/Fibonacci_number
Pseudokod (Python):
https://github.com/lion137/blog/blob/master/Matrix_Exponetiation_Fibo.ipynb


edytowany 1x, ostatnio: lion137
Patryk27
Wzory wyglądają trochę jak wariant 26 stąd: http://mathworld.wolfram.com/FibonacciNumber.html
lion137
He, he, podali ogólną macierz relacji rekurencyjnej, a Fibonacci jest prosta: http://mathworld.wolfram.com/FibonacciQ-Matrix.html
kq
Heh, nie wiedziałem że można fib w logn policzyć. Good to know.
BraVolt
To teraz na rekrutacjach liczymy fib O(log n), nie potrafi pani, pan policzyć, to nie możemy zaproponować dolnych widełek ale 60% dolnej stawki. Jakby co, przyznaję się, też nie wiedziałem.
Delor
Jest fib w O(1) https://gitlab.com/snippets/1879264 Niestety szybko znaczy mało dokładnie :/ (EDIT: teraz doczytałem: metoda 7 z linku Sarrusa)
BraVolt
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Warszawa
  • Postów:2918
0

When google for solution, then: Showing results for fibonacci Log N

OT
rozumiem, na rozgrzewkę albo interview zamiast fizz-buzz fibonacci O(n) albo dynamicznie z użyciem 'cache'
ale O(log n) albo zrzynasz gotowca z sieci abo co? Masz sam dojść do rozwiązania? chyba, że to akurat zadanie domowe z algebry a temat był omawiany na ćwiczeniach, ty go tylko implementujesz.


ja prosty inżynier jestem, rekurencje wypasałem ;)


"Kiedy wiedzieć czy zacząć nauke Springa? bo w czystej Javie to nic ciekawego nie zrobie chyba"
Ein Volk, ein Reich, ein Kwa-Kwa ***** ***
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:dzień
  • Postów:2512
2
N1
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:5
0

Nie wiem Panowie co jest nie tak z tym kodem. Użyłem tego algorytmu z metody 6 co wysłał Sarrus ale chyba robię coś nie tak. Mogłby ktoś mi to ładnie wyjaśnić ;/
Plus jeszcze chciałbym dodać funkcję setprecision żeby można było sobie sprawdzać nieograniczone wyrazy ciągów.

Kopiuj

#include <bits/stdc++.h>
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
const int MAX = 1000;
int f[MAX] = {0};
int fib(int n)
{
    cout << "Podaj nr wyrazu ciagu: ";
    cin>>n;
    if (n == 0)
        return 0;
    if (n == 1 || n == 2)
        return (f[n] = 1);
    if (f[n])
        return f[n];
    int k = (n & 1)? (n+1)/2 : n/2;
    f[n] = (n & 1)? (fib(k)*fib(k) + fib(k-1)*fib(k-1))
           : (2*fib(k-1) + fib(k))*fib(k);
    return f[n];
}
    cout<<setprecision(10000);
    cout<<endl<<"wyraz nr "<<n<<": "<<fib(n);
    return 0;
}

edytowany 1x, ostatnio: Neron101
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 3 godziny
  • Postów:4935
1

Co Ty funkcję w mainie Umieszczasz? Jakie "nieograniczone wyrazy ciągów" w trzydziestu jeden bitach (int)?

Kopiuj
const int MAX = 1000; 
 
int f[MAX] = {0}; 

int fib(int n) { 
    
    if (n == 0) 
        return 0; 
    if (n == 1 || n == 2) 
        return (f[n] = 1); 

    if (f[n]) 
        return f[n]; 
  
    int k = (n & 1)? (n+1)/2 : n/2; 
 
    f[n] = (n & 1)? (fib(k)*fib(k) + fib(k-1)*fib(k-1)) 
           : (2*fib(k-1) + fib(k))*fib(k); 
  
    return f[n]; 
} 


int main(int argc, char **argv){	
	
	int n;
	cin >> n;
	cout << "\n";
	cout << fib(n);
	cout << "\n";
	return 0;
}

N1
No z tym intem błąd, powinien być long double na takie duże liczby sorki, uczę się dopiero i dużo rzeczy ucieka mojej uwadze. A z mainem to już kombinowałem na różne sposoby dlatego tak
Sarrus
Dlaczego 'Umieszczasz' napisałeś z wielkiej litery?
lion137
Bo w drugiej osobie.
Sarrus
To co że w drugiej osobie? Albo coś pomieszałeś, albo jestem nie na czasie.
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:dzień
  • Postów:2512
0

Umieściłeś ciało funkcji fib w ciele funkcji main. To się w ogóle kompiluje? Na tej stronie jest możliwość skopiowania przykładu przyciskiem. Użyj go.

MarekR22
tak kompiluje się. Całą klasę tak można napisać. Jest to dziwne i też mnie wnerwia, ale da się.
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:4 minuty
2

Jesteś pewny że po prostu masz policzyć Fibonacciego?
A nie przypadkiem Fibonacciego modulo jakaś liczba? Albo Fibonacciego dla n tak małego, że by wynik mieścił się w typie wbudowanym?
Wygląda na to, że arytmetyka wielkich liczb jest tuż za twoim zasięgiem, a to jest potrzebne by policzyć dowolnego Fibonacciego.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
lion137
Właśnie, w temacie nie ma informacji, jakich typów użyć, a potem pisze o "nieograniczonych wyrazach ciągów"...
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:7 dni
1

Po:

  • poprawieniu: typów, zakresów, inicjalizacji;
  • Usunięciu zbędnych warunków, załączeniu pozostałych;
  • Oraz innych niezbędnych ruchach ...
Kopiuj
#include <iostream>
using namespace std;

unsigned long long fib(unsigned n)
{ 
	static const unsigned MAX=94;
	static unsigned long long f[MAX]={0,1,1};
	if(n>=MAX) return (unsigned long long)-1;
	if((!n)||(f[n])) return f[n];
	int k=(n+1)>>1; 
	return f[n]=(n&1)?(fib(k)*fib(k)+fib(k-1)*fib(k-1)):(2*fib(k-1)+fib(k))*fib(k);
}

int main()
{
	for(unsigned i=0;i<200;++i) cout<<i<<": "<<fib(i)<<endl;
	return 0;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.