Trwałość liczby określamy jako ilość powtórzeń procesu, aby z danej liczby a uzyskać cyfrę. Proces polega na sumowaniu cyfr danej liczby. Podczas wyszukiwania trwałości dowolnej liczby a należy przeprowadzić sumowanie cyfr. Jeśli wynikiem nie jest cyfra to należy za a przyjąć wynik sumowania, a następnie powtórzyć instrukcje. Cyfra uzyskana na końcu wyliczania trwałości liczby nosi nazwę pierwiastka cyfrowego. Przyjmujemy, że wszystkie cyfry dane jako liczb a mają trwałość 0.
Przyjmijmy, że liczba a = 123. Wtedy Pierwsze sumowanie zwróci 6. Oznacza to, że liczba ma trwałość 1, a jej pierwiastkiem cyfrowym jest 6. Jednak już w przypadku a = 9999 pierwsze sumowanie zwróci 36. Oznacza to, że trzeba jeszcze raz zsumować cyfry. W rezultacie otrzymujemy, że pierwiastkiem cyfrowym jest 9, a trwałość wynosi 2. Warto zauważyć, że liczba 20 i 10 mają trwałość 1, ale np. 19 ma trwałość 2.
Ze względu na fakt, że funkcja wyliczająca trwałość oraz pierwiastek cyfrowy będą korzystać z funkcji sumującej cyfry danej liczby to zostanie ona wyodrębniona jako oddzielna funkcja. Będzie ona nazywać się sumDigits() i będzie przyjmować jeden argument a, a zwracać będzie sumę cyfr danej liczby a.:
(2.) Ustal sumę cyfr na 0. (3. - 5.) Dopóki istnieją cyfry do zsumowania to je dodaj. (6.) Na koniec zwróć sumę cyfr liczby a.
Wyliczanie trwałości będzie odbywać się przy pomocy rekurencji. Warunkiem zatrzymania będzie uzyskanie sumy cyfr liczby jako pojedynczej cyfry.
(2.) W przypadku podania cyfry należy (3.) zwrócić trwałość 0. (4.) Dla pozostałych liczb należy wyliczyć sumę cyfr, a następnie (5.) zwrócić, że sumowanie się odbyło i jeśli suma cyfr nie jest cyfrą to należy proces ponowić przekazując wyliczoną wartość.
W celu poruszenia szarych komórek szukanie pierwiastka cyfrowego nie odbędzie się rekurencyjnie, a poprzez użycie pętli do .. while.
Napisane do tej pory funkcje można przetestować przy pomocy poniższego fragmentu kodu, która wczytuje od użytkownika liczbę a i wypisuje dla niej trwałość oraz pierwiastek cyfrowy.
Warto zauważyć, że dla każdej liczby wykonywane są dwa razy dokładnie te same operacje. Z tego powodu warto utworzyć dodatkowy typ danych, który pomieści zarówno trwałość jak i pierwiastek. W ten sposób czas obliczeń dla dowolnej liczby a poprawi się dwukrotnie. W tym rozwiązaniu niezmieniona pozostaje funkcja sumDigits() do sumowania cyfr dowolnej liczby.
Struktura musi jedynie zawierać dwa pola typu int. Prawidłowe opisania pozwoli później łatwiej wybrać dane ze zwróconego wyniku.
Teraz główna funkcja będzie dalej przyjmować liczbę a, ale zwróci dane jako strukturę persistance.
(2.) Zadeklaruj zmienną, która będzie przechowywać wynik i (3.) ustaw trwałość liczby na 0. (4.) Jeśli podane a to cyfra to (29.) ustaw pierwiastek cyfrowy na 0. Jednak (6.) dla każdej innej liczby a: (7. - 10.) wykonuj kolejne operacja sumowania cyfr, aż do uzyskania cyfry. W każdej iteracji należy pamiętać, aby zwiększyć atrybut trwałość w wyniku. (12.) Na koniec zwróć odpowiednią zmienną.
Po zmianie sposobu zwracania informacji należy delikatnie zmodyfikować program testujący:
Napisz algorytm, który wypisze na ekran ciąg liczb, gdzie k-ta wypisana liczba będzie najmniejszą liczbą o trwałości k. Przetestuj działanie aplikacji dla trwałości 0, 1, 2 oraz 3. Prawidłowym wynikiem wypisanym na ekran powinno być:
Najmniejsza liczba o trwałości k = 4 wynosi 19999999999999999999999. Z tego powodu nie jest zalecane, aby testować program dla wartości k = 3, ponieważ pomimo długich obliczeń wartości liczb bardzo szybko przekroczą zakres podstawowych zmiennych.