Dla podanej wartości n znajdź wszystkie liczby całkowite dla których suma: tej liczby, sumy cyfr tej liczby oraz suma cyfr sumy cyfr tej liczby daje wartość n. Czyli w sumie trzeba znaleźć sumę. Zmieniając zapis słowny na zapis matematyczny otrzymujemy następujące równanie:
a + suma(a) + suma(suma(a)) = n, gdzie suma() oznacza funkcję, która zwraca sumę cyfr przekazanej liczby
Przykładowo dla n = 123 istnieją trzy liczby spełniające podane równanie: 98, 107, 113. W tabelce zostało przedstawione odpowiednie liczby do zsumowania:
a | suma(a) | suma(suma(a)) | suma |
---|---|---|---|
98 | 17 | 8 | 123 |
107 | 8 | 8 | 123 |
113 | 5 | 5 | 123 |
Sumowanie cyfr jest algorytmem liniowym, którego złożoność zależy od ilości cyfr w zapisie liczby. Im więcej liczba posiada cyfr tym więcej trzeba wykonać operacji arytmetycznych. Z tego powodu najbardziej kosztowną operacją w algorytmie jest obliczenie sumy cyfr.
Suma trzech liczb musi wynieść n. W celu znalezienia wszystkich liczb należy sprawdzić wszystkie liczby od [0, n]. Dla każdej z nich należy wyznaczyć sumę cyfr i tej sumy sumę cyfr, a następnie sprawdzić warunek. Zadanie to realizuje poniższy kod:
Sumowanie cyfr niektórych liczb jest wykonywane więcej niż jeden raz. Oznacza to, że można stworzyć pewien bufor w którym zostaną zapamiętane obliczone do tej pory wartości. Nie należy jednak zapisywać wszystkich obliczonych sum, ponieważ doprowadzi to z kolei do niepotrzebnie zwiększonego zużycia pamięci.
Jeśli liczba składa się z p cyfr to znaczy, że największa możliwa suma jej cyfr wynosi 9p. Czyli przed rozpoczęciem obliczeń należy przygotować 9p + 1 pozycji na zapisanie sum. Następnie suma cyfr sumy cyfr nie będzie obliczana poprzez dwukrotne wywołanie funkcji sumujCyfry(), a poprzez odczytanie odpowiedniej wartości z wypełnionej tablicy.
Poniższy kod realizuje przedstawione rozumowanie:
W celu przetestowanie działania kodu można skorzystać z poniższego fragmentu. Wczyta od użytkownika żądaną sumę n i rozpocznie obliczenia.