Używając tylko dodawania jak otrzymać 1000 mając do dypozycji tylko osiem cyfr 8? Nie wolno używać żadnego innego operatora matematycznego (takiego jak mnożenie czy nawiasy).
Prawidłowa odpowiedź to 888 + 88 + 8 + 8 + 8 = 1000.
Istnieje wiele różnych sposobów otrzymania wyników. Najszybsza metoda do rozwiązywania takiego zadania polega na znalezieniu jak największej liczby z cyfr mniejszej od szukanego wyniku. W tym przypadku jest to 888. Następnie proces ten powtarzamy. Kolejna znaleziona liczba to 88. Do podziału zostało 1000 - 888 - 88 czyli 24 i 3 cyfry 8.
Napisz program, który dla podanej cyfry oraz ile cyfr jest do dyspozycji wypisze wszystkie możliwe sumy do uzyskania. Wśród sum nie powinno być zduplikowanych wartości. Przetestuj działanie programu.
Napisana funkcja poszukująca wszystkich sum będzie rekurencyjna. W każdym wywołaniu funkcja będzie wiedziała ile zostało jeszcze cyfr do przydziału oraz jaka jest dotychczasowa suma. Wewnatrz funkcji jeśli jest chociaż jedna cyfra do przydziału to program sprawdzi co się stanie jeśli przydzieli dowolną ilość. Przykładowo jeśli zostało n cyfr to program wywoła się rekurencyjnie uprzednio zabierając n, n-1, ..., 2, 1 cyfrę. Jednak znajdowane wartości mogą być takie same. Z tego powodu dane zapisywane na listę znalezionych wartości będą odrzucane jeśli już w niej występują.
Poniższa funkcja szukaj() przyjmuje cztery argumenty: lista - zmienna do której zostaną zapisane znalezione wyniki, c - grupowane cyfry, zostalo - ile zostało cyfr do przydziału oraz suma - suma liczb z poprzednich wywołań (dla danej gałęzi wywołań).
(2.) Jeśli wciąż są wartości do rodzielenia to (3. - 4.) sprawdź każdy przydział. Jednak (5.) gdy już nie możliwości przydziału to (6. - 8.) wyszukaj gdzie wstawić na listę i (9. - 12.) wstaw jeśli zostaną spełnione odpowiednie warunki.
Funkcja korzysta z pomocniczej funkcji generuj(), która generuje liczbę złożoną z ile cyfr c.
Działanie napisanej funkcji można przetestować przy pomocy poniższego fragmentu kodu
Przykładowo podając, że w zadaniu jest osiem cyfr osiem okazuje się, że do uzyskania są, aż 22 różne sumy! Zostały one przedstawione poniżej: