Liczba Trimorficzna to taka liczba naturalna n, która podniesiona do sześcianu zawiera na końcu wartość n. Przykładowo taką liczbą jest 9, ponieważ 93 = 729. Innym przykładem jest liczba 25, ponieważ 253 = 15625.
Warto zauważyć, że liczby Trimorficzne należą do tej samej rodziny liczb co liczby Automorficzne. Sposób wykrywania jest identyczny, ale różnią się potęgą do której jest podnoszona liczba n. Na podstawie tych dwóch rodzajów liczb można utworzyć następujące uogólnienie:
Liczbą kmorifczną nazywamy liczbę naturalną n, która podniesiona do potęgi k zawiera na ostatnich cyfrach liczbę n.
Zdecydowanie najprostszą metodą na implementację sprawdzenia czy liczba jest automorficzna polega na obliczeniu potęgi 3 danej liczby a, a następnie sprawdzeniu p ostatnich pozycji sześcianu liczby czy wynoszą tyle co a, gdzie p to ilość cyfr liczby a.
Zadanie to realizuje poniższy kod:
(2.) Wyliczenie potęgi. (3.) Wyliczenie liczby 10p, gdzie p to ilość cyfr. Najszybszą metodą wyliczenia długości cyfry jest wyliczenie jej logarytmu dziesiętnego, pobrania części całkowitej i zwiększenie wyniku o 1. (4.) Zwrócenie wyniku czy końcówka wyliczonego sześcianu jest równa liczbie a.
Jak wiadomo sprzęt komputerowy potrafi przechowywać w zmiennych prostego typu tylko liczby z ograniczonego zakresu. W przypadku sześcianu wartości bardzo szybko rosną i już powyżej wartości 1290 może dojść do przekłamań w wyniku. (Dla zmiennych typu int). Jednym ze sposobów na zwiększenie tej wartości jest stworzenie własnej implementacji potęgowania. Należy tu skorzystać z faktu, że do ostatecznego warunku potrzebne jest jedynie p ostatnich cyfr wyliczanego sześcianu.
Z tego powodu po każdym mnożeniu będzie wyciągana reszta z dzielenia aktualnej wartości przez wartość 10p. Dzięki tej prostej operacji wartość graniczna dla której algorytm zwróci prawidłową wartość zwróci to 46340. (Wartość wyliczona dla typu int).
Implementacja własnego potęgowania została dodana w linijkach (3. - 5.).
Kod wyliczający zgodnie z definicją uogólnienia liczb morficznych jest bardzo podobny do napisanej wyżej implementacji:
Po pierwsze (1.) w definicji funkcji pojawia się obowiązek podania dodatkowego argumentu k. Ma to za zadanie określić rząd morficzności k. (2.) Wyliczenie liczby 10p nie zmienia się. W trakcie wyliczania potęgi (3. - 5.) należy pamiętać o (4.) poprawnej ilości pętli. (6.) Sprawdzanie czy liczba jest k morficzna pozostaje niezmienna.
Posiadając funkcję iskmorphic() można dopisać prostszą implementacją funkcji isTrimorphic():
W celu wypisania wszystkich liczb kmorficznych z zakresu [1, 1000] wystarczy poniższa funkcja main():
Napisz funkcję, która dla podanego zakresu [a, b] oraz zakresu [p, q] wypisze wszystkie ile jest w danym zakresie liczby pmorficznych, (p+1)morficznych, ..., qmroficznych. Pamiętaj o komunikatach dla użytkownika podczas wprowadzania danych.
Przykładowo dla zakresu [1, 100] i zakresu rzędów [2, 5] program powinien wypisać: