Zadanie - Czy się zatrzyma?

0

Witam.
Mam do rozwiązania takie zadanie:
Bajtazar przechadzał się koło Biblioteki Uniwersyteckiej w Warszawie i na jednej z fasad zobaczył fragment programu opatrzony pytaniem „Czy się zatrzyma?”. Problem wyglądał intrygująco, dlatego Bajtazar postanowił zająć się nim po powrocie do domu. Niestety, gdy zapisywał kod na kartce (od razu zamieniając go na
język C++), popełnił błąd i zanotował:
while (i! = 1)
if
(i% 2 == 0)
i=i /2;
else
i= 3∗i+ 3;
Bajtazar próbuje teraz ustalić, dla jakich wartości początkowych zmiennej i zapisany przez niego program zatrzyma się. Zakładamy przy tym, że zmienna
i ma nieograniczony rozmiar, tj. może przyjmować dowolnie duże wartości.
Wejście
Pierwszy i jedyny wiersz wejścia zawiera jedną liczbę całkowitą i (2≤ i ≤10^14), dla której należy sprawdzić,czy podany program zatrzyma się.
Wyjście
W pierwszym i jedynym wierszu wyjścia Twój program powinien wypisać jedno słowo TAK, jeśli programzatrzyma się dla podanej wartości i, lub NIE
w przeciwnym przypadku.
Przykład
Dla danych wejściowych:
4
poprawnym wynikiem jest:
TAK

Wiem, że jeśli i będzie potęgą 2 program powinien wypisać TAK, a jeśli i będzie nieparzyste powinien wypisać "NIE". Proszę o pomoc, jakie założenia mogę jeszcze zrobić?

0

To chyba jedyna założenia dla danego zadania, napisany na szybko skypt w pythonie nie znalazł potęgi dwójki podzielnej przez 3. A co za tym idzie możesz uznać że 3*i + 3 nigdy nie da potęgi dwójki. A więc albo i od początku jest potęgą dwójki albo pętla nigdy się nie skończy.

2

@sig powiedz że żartujesz i że nie musiałeś spawdzać czy 3*k nigdy nie jest postaci 2^n. Czemu wszyscy śpią na matematyce dyskretnej? o_O Lekcja na dziś: faktoryzacja liczb naturalnych. Każdą liczbę złożoną można rozłożyć na iloczyn liczb pierwszych. Liczby 2 oraz 3 są pierwsze więc jeśli dana liczba ma w rozkładzie 3 to nie ma takiej możliwości żeby rozłożyć ją na iloczyn samych 2.
Wracając do zadania, to dla nieparzystej liczby robimy i = 3*(i+1) a to mozemy też zapisać jako pewne i = 3*((i-1)+2) a wiemy że i-1 jest parzyste (skoro i było nieparzyste!) więc finalnie nowe i jest zawsze parzyste a podzielone przez 2 da nam i = 3*((i-1)/2+1). To nigdy nie będzie wynosić 1.

1 użytkowników online, w tym zalogowanych: 0, gości: 1