Strona główna » Algorytmy » Artykuły » Wskazówki Zegara
 

Wskazówki Zegara

Cel

Ile razy dziennie na tarczy zegara spotyka się wskazówka godzinowa oraz minutowa? O których godzinach dochodzi to takiej sytuacji? Zakładamy, że tarcza zegara jest 12 godzinna, a doba trwa 24 godziny. Zaliczamy każde minięcie wskazówki minutowej przez godzinną nawet jeśli nie zatrzyma się dokładnie tam gdzie godzinowa.

Odpowiedź

Wskazówki spotkają się dokładnie 22 razy. W poniższej tabelce zostały spisane wszystkie godziny:

00:00~01:06~02:11~03:17
~04:22~05:28~06:33~07:39
~08:44~09:50~10:5512:00
~13:06~14:11~15:17~16:22
~17:28~18:33~19:39~20:44
~21:50~22:55  

Wszystkie godziny prócz 00:00 oraz 12:00 zostały podane jako czasy przybliżone, ponieważ wskazówki nie spotykają się dokładnie o tej godzinie, ale jest to najbliższy czas po zatknięciu się wskazówek.

Wyjaśnienie

Intuicyjne

Rozpocznijmy rozmyślania od ustawienia wskazówek na 12. Pierwsze miejsce spotkanie jest oczywiste. Jak wiadomo wskazówka minutowa minie godzinową dopiero jak rozpocznie się kolejna godzina. Dotyczy to kolejno godzin 2, 3, 4, 5, 6, 7, 8, 9, 10. Teraz jednak pozostaje pytanie czy po godzinie 11 wskazówka minutowa dogoni godzinową? Odpowiedź brzmi nie dogoni, bo spotkają się z powrotem na 12, a to już było liczone. Innymi słowy dla 12 godzinnego dnia odpowiedź to 11. Pełna doba oznacza dwa razy identyczny przebieg wskazówek po zegarku, więc faktycznie 22 wydaje się być dobrą odpowiedzią.

Dowód matematyczny

Pełny obrót wskazówki to 360º. Oznacza to, że co minute wskazówka minutowa obraca się o 6º. Na zegarze wyszczególnionych jest dokładnie dwanaście godzin. Z tego można wyliczyć, że wskazówka godzinowa obraca się łącznie o 30º co godzinę i 0.5º co minutę.

Wskazówki poruszają się w tą sama stronę, więc ich prędkości należy odjąć, aby otrzymać prędkość względną wskazówki minutowej do godzinowej. Wtedy taka prędkość to v' = 6º - 0.5º = 5.5º. Ustawmy wskazówki na 12. Od tej pory wskazówki będą się spotykać co 360 / 5.5º = 720/11 minut. W przybliżeniu wynosi to 65.(45). Na podstawie tej informacji można wyliczyć ile będzie spotkań poprzez podzielenie ilości minut w dobie przez czas co ile się spotykają: (24·60)/(720/11) = 22. □

Implementacja

Zadanie można rozwiązać w sposób matematyczny, ale również informatyczny. Przedstawiony poniżej kod wykorzystuje wiedzą zdobytą w wyjaśnieniach zagadki. Symuluje on przechodzenie wskazówek zegara. Ze względu na fakt, że dokładnej wartości nie można wyliczyć to program korzysta z faktu "wyprzedzania się wskazówek".

C++
C#
  1. int ileWspolnych() {
  2.   int licznik = 0;
  3.   int pelnyObrot = 60 * 12;
  4.   int oh = 0, om = 0;
  5.   bool wyprzedzila = false;
  6.   for (int i = 0; i < 24 * 60; i++) {
  7.     if (om >= oh && !wyprzedzila) {
  8.       licznik++;
  9.       wyprzedzila = true;
  10.     }
  11.     oh = (oh + 1 ) % pelnyObrot;
  12.     om = (om + 12) % pelnyObrot;
  13.     if (om == 0)
  14.       wyprzedzila = false;
  15.   }
  16.   return licznik;
  17. }

W powyższym kodzie kolejno: (2.) deklarujemy licznik, gdzie będzie przechowywana ilość spotkań, (3.) pelnyObrot - tutaj wyliczane jest ile ma pełny obrót "kroków". Za krok przyjmuje przesunięcie wskazówki godzinowej w trakcie jednej minuty. Potem (4.) ustawiamy wskazówki na [12] i (5.) stwierdzamy, że początkowo wskazówki się nie wyprzedziły. (6.) Dla każdej minuty w godzinie symulujemy przejście każdej wskazówki o jedną minutę. Na początku: (7.) sprawdzamy czy doszło do spotkania. Jeśli tak to (8.) zwiększamy licznik i (9.) zaznaczamy, że w tej godzinie już wskazówka godzinowa została wyprzedzona. Potem obracana jest wskazówka (11.) godzinowa oraz (12.) minutowa. Minutowa obraca się 12 razy szybciej od godzinowej, ponieważ 12 = 6º / 0.5º. Należy oczywiście pamiętać, że (13.) jeśli wskazówka wróciła na [12] to (14.) znowu istnieje szansa, że wyprzedzi. Na koniec (16.) zwracamy wartość zmiennej licznik.

Testowanie funkcji

W celu wypisania ile razy mijają się wskazówki wystarczy poniższy kod:

C++
C#
  1. int main() {
  2.   cout << ileWspolnych();
  3.   system("pause");
  4.   return 0;
  5. }

Zadania

Zadanie 1

Napisz funkcję ileWspolnych(), która pozwoli na ustalenie długości doby, ile godzin wyróżnionych ma tarcza zegara oraz ile minut trwa godzina. W tabeli zostały przedstawione wyniki dla przykładowych zestawów danych:

DobaGodzinaTarczaWynik
12 h60 m12 h11
24 h60 m24 h23
16 h8 m4 h12