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

[C++, zadanie] Podróżnik Antonio: "rytuał ułatwiający szamanom wejście w trans"

Ostatnio zmodyfikowano 2013-11-08 23:57
Autor Wiadomość
Miralem
Temat założony przez niniejszego użytkownika
[C++, zadanie] Podróżnik Antonio: "rytuał ułatwiający szamanom wejście w trans"
» 2013-11-08 22:11:08
Treść zadania:
Znany podróżnik Antonio przebywając wśród Indian Ameryki Południowej zapoznał się z rytuałem ułatwiającym szamanom wejście w trans. Szaman zasiada przy ognisku i określa magiczną liczbę x. Następnie, jeśli x jest liczbą parzystą, to szaman dorzuca do ogniska garść kwiatów i dzieli x przez 2. Jeśli natomiast x jest nieparzyste, to do ogniska dorzuca garść liści i oblicza wartość 3x+1. Te operacje należy powtarzać dla otrzymywanych kolejno wartości do czasu kiedy x będzie równe 1.
Antonio zastanawia się, dla jakich wartości x rytuał zostaje zakończony po co najwyżej 15 krokach. Chciałby też wiedzieć, ile kwiatów i liści potrzeba do wprowadzenia szamana w trans. W związku z tym poprosił programistów o zaimplementowanie funkcji, która dla zadanej wartości x odpowie na pytanie, czy rytuał zakończy się po najwyżej 15 krokach, i jeśli tak, to poda także liczbę zużytych garści kwiatów i liści.

Wejście

Wejście zawiera co najwyżej 20 testów. Każdy test składa się z jednej liczby naturalnej x z zakresu od 2 do 100. Ostatnią liczbą wejścia jest zawsze 0.

Wyjście

Dla każdego testu należy w osobnej linii wypisać słowo "TAK", jeśli rytuał zakończy się po co najwyżej 15 krokach, lub "NIE" w przeciwnym przypadku. Jeśli odpowiedź brzmi "TAK", należy w tej samej linii wypisać także liczbę zużytych w rytuale garści kwiatów i garści liści.

Przykład

Wejście:

7
10
0

Wyjście:

NIE
TAK 5 1
Mój kod:
C/C++
#include <iostream>

bool rytual( int x, int & k, int & l ) {
    while( x > 1 ) {
        if(( k + l ) == 15 ) {
            return false;
        }
        if( x % 2 == 0 ) {
            k++;
            x /= 2;
        }
        else {
            x = 3 * x + 1;
            l++;
        }
    }
    if( x == 1 ) {
        return true;
    }
}

int main() {
    int x;
    while( x != 0 ) {
        int kwiaty = 0, liscie = 0;
        std::cin >> x;
        if( rytual( x, kwiaty, liscie ) == true ) {
            std::cout << "TAK" << " " << kwiaty << " " << liscie << std::endl;
        }
        else if( rytual( x, kwiaty, liscie ) == false && x != 0 ) {
            std::cout << "NIE" << std::endl;
        }
    }
    return 0;
}

Niby program działa, dla podanego wejścia wypisuje poprawne wyjście, ale rzekomo mam zbędne warunki, i niemal na sto procent w pętli while. Wiem, że jest tam ich od groma, ale żaden nie wydaje mi się zbędny, bo wówczas program się sypie (dla zera, które ma zakończyć program oddaje wartość NIE, itp.)
P-95729
docentpp
» 2013-11-08 23:57:22
Niepotrzebnie wywołujesz dwa razy funkcję rytual.
Upraszczając kod,zamiast w mainie taki warunek :

C/C++
else if( rytual( x, kwiaty, liscie ) == false && x != 0 )

powinien być taki :

C/C++
else if( x != 0 )



P-95746
« 1 »
  Strona 1 z 1