[Algorytmy] Wyznacz wartości dziesiętne.

Awatar użytkownika
piotrowm
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 19 lis 2014, o 21:16
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: piotrowm »

Witam. Oto przede mną postawiono takie zadanie:

Ciąg Fibonacciego zdefiniowany jest następująco:

\(\displaystyle{ Fib(n)= \begin{cases} 0 \Rightarrow n = 0 \\ 1 \Rightarrow n = 1\\ Fib(n-2)+Fib(n-1) \end{cases}}\)

Dowolną liczbę naturalną możemy przedstawić w postaci ciągu zerojedynkowego
zdefiniowanego w sposób następujący: jeżeli k-ta cyfra jest równa 1, wtedy
odpowiada wartości Fib(k), jeżeli 0 to jest równa 0 (cyfry numerujemy od prawej do
lewej zaczynając od jeden).

Przykład: \(\displaystyle{ {11011101_F_i_b= 1(21) + 1(13) + 0(8) + 1(5) + 1(3) + 1(2) + 0(1) + 1(1) =
21 + 13 + 5 + 3 + 2 + 1 = 45_1_0}\)


Napisz algorytm wyznaczający wartości dziesiętne takich ciągów zerojedynkowych.
Uwaga: elementy ciągu Fibonacciego nie mogą być stablicowane.

Napisany przeze mnie program:

Kod: Zaznacz cały

#include <iostream>
#include <string>

using namespace std;

string kb;
int i;
int licz;

int fib(int i)
{
    if(i<2)
    return 1;

    return fib(i-2)+fib(i-1);
}

int main()
{
    int i;
    cout << "Wprowadz KodBin: " << endl;
    cin >> kb;

    for (i=0; i<=kb.size(); i++)
    {
        if (kb[i]=='1')
        {
            if (i>=2)
            {
                licz = licz + fib(i);
            }
            if (i==1)
            {
                licz = licz + 1;
            }
            if (i==0)
            {
                licz = licz + 1;
            }
        }
    }

    cout << "Ostateczy wynik licz = " << licz << endl;



    return 0;
}
Problem polega na tym iż gdy zapiszę kod binarny podany w przykładzie \(\displaystyle{ 11011101}\) wynik jest równy 39 (oczywiście jest to nie właściwy wynik), natomiast jeżeli zapiszę kod binarny na wspak czyli \(\displaystyle{ 10111011}\) pojawia mi się prawdziwy wynik. Jakieś sugestie dlaczego coś takiego się dzieje i wskazówki jak to poprawić?
Ostatnio zmieniony 31 gru 2014, o 08:32 przez Afish, łącznie zmieniany 2 razy.
Powód: Poprawa wiadomości.
Awatar użytkownika
Medea 2
Użytkownik
Użytkownik
Posty: 2491
Rejestracja: 30 lis 2014, o 11:03
Płeć: Kobieta
Podziękował: 23 razy
Pomógł: 479 razy

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: Medea 2 »

Liczysz najwyraźniej od niewłaściwej strony, odwróć pierwszy łańcuch znaków przed operowaniem na nim.
Awatar użytkownika
piotrowm
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 19 lis 2014, o 21:16
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: piotrowm »

Czy jest szansa aby uniknąć tej operacji, są to dodatkowe linijki kodu. Czy możesz mi potwierdzić że jest to jedna droga jaką tutaj trzeba zastosować?
Awatar użytkownika
Medea 2
Użytkownik
Użytkownik
Posty: 2491
Rejestracja: 30 lis 2014, o 11:03
Płeć: Kobieta
Podziękował: 23 razy
Pomógł: 479 razy

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: Medea 2 »

Możesz też w drugim forze przechodzić tablicę od tyłu i zmienić warunki w ifach.
Awatar użytkownika
piotrowm
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 19 lis 2014, o 21:16
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: piotrowm »

Kod: Zaznacz cały

for (i=kb.size(); i>=0; i--)
Jeśli przejdę z tym for'em wynik wychodzi taki sami. Możesz coś więcej powiedzieć na temat zmiany w if'ach?
Awatar użytkownika
Medea 2
Użytkownik
Użytkownik
Posty: 2491
Rejestracja: 30 lis 2014, o 11:03
Płeć: Kobieta
Podziękował: 23 razy
Pomógł: 479 razy

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: Medea 2 »

Gotowców tu się nie daje, ale widzę, że coś próbowałeś sam napisać. Znaj moje dobre serce i patrz: . W Twojej implementacji wielokrotnie uruchamiałeś procedurę fib, co marnowało czas. Teraz jest szybciej i chyba bardziej elegancko. Garść wskazówek na dobranoc: unikaj zmiennych globalnych, zaglądania tam, gdzie nie powinno się zaglądać (ten for działał o jeden krok za dużo - nie wiem, jak ja tam widziałam dwa fory w poprzednim poście). Z ciekawości, dlaczego nie mogłeś dodać tych kilku linijek (odwrócenie stringa)?
Awatar użytkownika
piotrowm
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 19 lis 2014, o 21:16
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: piotrowm »

Na pocieszenie jednak udało mi się i okazało mi się że jednak to nie jest "aż" tyle linijek.

Kod: Zaznacz cały

for(i=0; i<kb.size(); i++) // petla obracajaca podany kodBin
    {
       odw+=kb[kb.size()-i-1];
    }
Teraz już zostało tylko go ew. usprawnić no i zapobiec błędom (wprowadzenie liter, znaków). Dzięki za zainteresowanie .
Awatar użytkownika
Medea 2
Użytkownik
Użytkownik
Posty: 2491
Rejestracja: 30 lis 2014, o 11:03
Płeć: Kobieta
Podziękował: 23 razy
Pomógł: 479 razy

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: Medea 2 »

Można użyć gotowego narzędzia

Kod: Zaznacz cały

#include <algorithm>

std::reverse(str.begin(), str.end());
Awatar użytkownika
piotrowm
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 19 lis 2014, o 21:16
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: piotrowm »

Jeszcze takie lekkie odświeżenie, czy:

Kod: Zaznacz cały

int fib1 = 1, fib2 = 1;
Można uznać za wyniki wcześniej stablicowane ?
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: Vardamir »

Nie, to są wartości początkowe dla twojego algorytmu, a nie gotowe wyniki.

Choć powinieneś chyba mieć

Kod: Zaznacz cały

int fib0 = 0, fib1 = 1;
jeśli chcemy być zgodni z zadaniem
Awatar użytkownika
piotrowm
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 19 lis 2014, o 21:16
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[Algorytmy] Wyznacz wartości dziesiętne.

Post autor: piotrowm »

OK, dzięki. Nie chce żeby przypadkiem podczas omawiania algorytmów, wyskoczył taki babol.

Pozdrawiam.-- 27 sty 2015, o 20:57 --\(\displaystyle{ y = \sum_{}^{} (3,8,13,14(0,1,4,6,9,11,12))}\)

\(\displaystyle{ 3,8,13,14 -}\) "\(\displaystyle{ 1}\)"

\(\displaystyle{ 0,1,4,6,9,11,12 -}\) "\(\displaystyle{ -}\)"

Reszta będzie to "\(\displaystyle{ 0}\)"
ODPOWIEDZ