[C++, zadanie] Podróżnik Antonio: "rytuał ułatwiający szamanom wejście w trans"
Ostatnio zmodyfikowano 2013-11-08 23:57
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:
#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.) |
|
docentpp |
» 2013-11-08 23:57:22 Niepotrzebnie wywołujesz dwa razy funkcję rytual. Upraszczając kod,zamiast w mainie taki warunek : else if( rytual( x, kwiaty, liscie ) == false && x != 0 )
powinien być taki : |
|
« 1 » |