//Zaprogramuj, z użyciem jednokierunkowej listy cyklicznej (w której następnikiem „ostatniego”
elementu jest „pierwszy” element listy), tzw. problem Flawiusza Josephusa.
Objaśnienie:
Flawiusz Josephus był historykiem żyjącym w I w. Legenda głosi, że gdyby nie jego talent matematyczny,
nie dożyłby chwili gdy został sławny. W czasie wojny żydowsko-rzymskiej był on w
oddziale 41 (czyli „N”) żydowskich buntowników osaczonych przez Rzymian. Woląc śmierć od
niewoli, buntownicy stanęli w kole, odliczając i zabijając co trzecią (co „K-tą”) osobę. Jednak
Flawiusz, wraz ze swym przyjacielem, chcieli uniknąć takiej śmierci. Flawiusz szybko obliczył
gdzie powinni obaj stanąć, aby byli ostatnimi dwiema osobami, które zostaną przy życiu.
Program powinien więc, dla zadanych dwóch liczb: N oraz K (jak w objaśnieniu), wyznaczyć
początkową pozycję dwóch elementów listy, które pozostaną w powtarzanym cyklicznie procesie
usuwania co K-tego elementu listy N-elementowej, rozpoczynając od 1. elementu (pierwszy
usuwany element ma numer: (K-1) mod N +1 ). Należy też wyświetlić kolejne usuwane elementy
listy.//
Listę już wykonałem, elementy są odejmowane i zostają 2, lecz nie mam algorytmu jak z marszu obliczyć, które 2 miejsca zostaną jako ostatnie. W necie jest problem rozwiązany, ale tylko dla wskazania ostatniego elementu, a nie 2.
Byłbym wdzięczny za algorytm/funkcję:
Wejście:
N - liczba ludzi (stoją tak jakby w kręgu)
K - co który jest usuwany
Zaczynamy zabijać ludka stojącego na pozycji **(K-1) mod N +1 ** (Wydaje mi się czy zawsze z tego wyjdzie K?)
Wyjście:
A,B - numery 2 ludków, którzy zostaną jako ostatni przy życiu.
Pewnie to z 5 linijek kodu, ale nie daję rady, prawie całe zadanie zrobione tylko tego mi brakuje.
(może być w pseudokodzie, C++, Pascal).