Prostsze rozwiązanie zadania dotyczącego ciągu rekurencyjnego
Ostatnio zmodyfikowano 2017-05-12 14:59
rudykot Temat założony przez niniejszego użytkownika |
Prostsze rozwiązanie zadania dotyczącego ciągu rekurencyjnego » 2017-05-10 21:34:03 Poszukuję prostszego rozwiązania zadania o treści:Oblicz n-ty wyraz następującego ciągu:a 1 = A a 2*k = B*a k a 2*k + 1 = a 1 + a 2*kWejścieNa wejściu podane są trzy liczby całkowite A, B i n. Możesz założyć, że wynik zmieści się w zakresie typu int. WyjścieZwróć n-ty element ciągu. PrzykładDla danych wejściowych 2 3 3 poprawną odpowiedzią jest 8 Dla danych wejściowych 5 7 49 poprawną odpowiedzią jest 96045 Moje rozwiązanie:#include <iostream>
using namespace std;
int main()
{ int n, A, B, k; cin >> A; cin >> B; cin >> n; int tab[ n ]; fill_n( tab, n, 0 ); for( int i = 1; i <= n; i++ ) { tab[ 1 ] = A; if( i % 2 == 0 ) k = tab[ i / 2 ] * B; if( i % 2 > 0 ) k = tab[ i - 1 ] + A; tab[ i ] = k; } cout << tab[ n ]; return 0; }
|
|
pekfos |
» 2017-05-10 21:57:55 Twoje rozwiązanie jest błędne, źle używasz i tworzysz tablice. Ten problem nawet nie wymaga tablicy i wystarczy prosta pętla. Prościej i szybciej, bo o złożoności logarytmicznej od n, a nie liniowej. |
|
rudykot Temat założony przez niniejszego użytkownika |
» 2017-05-11 20:59:20 Proszę o podpowiedź, ponieważ nie potrafię odnaleźć zależności by wykorzystać ją w pętli. Być może rozwiązanie jest oczywiste jednak nie widzę go zupełnie. |
|
pekfos |
» 2017-05-11 21:09:19 Lepiej to widać po nieco innym zapisaniu ciągu: a1 = A a2k = B * ak a2k+1 = A + B * ak Dziel k całkowicie przez 2 aż do osiągnięcia wartości 1. Jeśli k jest w jakimś momencie nieparzyste, do dodaj do wyniku A*Bx.
|
|
rudykot Temat założony przez niniejszego użytkownika |
» 2017-05-12 14:59:32 Dziękuję bardzo, rozpisałem 20 kolejnych wyrazów ciągu i każdy z nich sprowadziłem do sumy iloczynów A*(B^x). Faktycznie rozwiązanie było oczywiste, ale go nie widziałem. #include <iostream> #include <math.h>
using namespace std;
int main() { int A, B, n, w = 0, x = 0; cin >> A; cin >> B; cin >> n; do { if( n % 2 > 0 ) w = w + A * pow( B, x ); x = x + 1; n = n / 2; } while( n >= 1 ); cout << w; return 0; }
Zamykam |
|
« 1 » |