Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prostsze rozwiązanie zadania dotyczącego ciągu rekurencyjnego

Ostatnio zmodyfikowano 2017-05-12 14:59
Autor Wiadomość
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:
a1 = A
a2*k = B*ak
a2*k + 1 = a1 + a2*k

Wejście

Na 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ście

Zwróć n-ty element ciągu.

Przykład

Dla danych wejściowych
2 3 3
poprawną odpowiedzią jest
8
Dla danych wejściowych
5 7 49
poprawną odpowiedzią jest
96045

Moje rozwiązanie:

C/C++
#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;
}
P-160919
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.
P-160920
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.
P-160957
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.


P-160958
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.

C/C++
#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
P-160999
« 1 »
  Strona 1 z 1