Zadanie jest z pozoru proste, ale na zwykłej kartce bardzo czasochłonne:
Matematyk ma trzech synów i musimy określić ich wiek znając iloczyn wieku wszystkich dzieci oraz ilorazu wieku starszego do młodszego.
Przykładowo jeśli iloczyn wszystkich dzieci będzie miał 189 i iloraz wyniesie 3 to jest tylko jedna prawidłowo kombinacja liczb i synowie mają wtedy: 3, 7 i 9 lat.
Specyfikacja wygląda tak:
Oczywiście dla bardziej ambitnych proponuje napisanie algorytmu, który sprawdzałby ile jest łącznie kombinacji spełniających kryteria zadania.
Przyjmijmy następujące zmienne:
Otrzymujemy, że , gdzie . Na tej podstawie można stwierdzić, że ostateczna funkcja jest postaci
Wiadomo, że . Szukam w takim razie takiego x, który jest dzielnikiem Najprostszym sposobem jest dokonać rozkładu . Wybieramy wszystkie zduplikowane liczby z rozkładu i w ten sposób uzyskujemy wiek najmłodszego. Wiek średniego możemy uzyskać na dwa sposoby: ze wzoru lub obliczając iloczyn liczb niezduplikowanych w rozkładzie
Rozwiązując tym sposobem przykład zadania otrzymujemy, że s = 189, i = 3. Wyznaczamy wzór funkcji: Rozkładamy 63 na czynniki pierwsze: {3, 3, 7}. Odczytujemy, że najmłodszy ma 3 lata, średni 7. Wiek najstarszego najprościej wyliczyć ze wzoru. W tym przypadku otrzymamy 9.
Zamieszczone rozwiązanie informatyczne stara się wyznaczyć wszystkie możliwe rozwiązania zadania. Używana jest tu metoda nieco lepsza od brute force. Program wykonuje wszystko dokładnie tak jak zostało wyjaśnione w rozwiązaniu matematycznym.
Do wyszukiwania rozwiązań służy funkcja wyszukaj(), która przyjmuje dwa argumenty: t - iloczyn wieku wszystkich chłopców oraz n - iloraz wieku najstarszego do najmłodszego.
(2.) Początkowo łączna liczba kombinacji wynosi 0. (3.) Stwierdzamy, że wiek najmłodszego oznacza zmienna i. Wiadomo, że wtedy kwadrat zmiennej pomnożony przez n musi być mniejszy, równy t. Dla każdej liczby spełniającej ten warunek: (4.) wyliczamy wartość w (tj. iloczyn najmłodszego i najstarszego z braci). Jeśli (5.) iloczyn t jest podzielny przez w to: (6. - 21.) można przejść do wyszukania wszystkich możliwych rozkładów.
(22.) Jeśli znaleziona wartość k mieści się w przedziale wieku braci to (23. - 24.) dodajemy kombinację. W przeciwnym razie (26.) zgłaszamy, że rozwiązanie jest niepoprawne. (28. - 34.) Jeśli rozwiązanie jest poprawne to wypisujemy oraz (33.) zwiększamy liczbę znalezionych rozwiązań. Na koniec (37.) zwracamy wartość zmiennej s.
W celu znalezienia rozkładu liczby funkcja wyszukaj() korzysta z funkcji rozklad(), której działanie polega na znalezieniu najmniejszego dzielnika liczby t.
W celu przetestowania działania napisanej funkcji wyszukaj() można skorzystać z poniższego kodu: