Nie możesz tak po prostu obliczyć wartości silni dla ogromnych argumentów - wartość będzie jeszcze bardziej ogromną liczbą, którą podstawowe typy (nawet taki long double) nie będą w stanie pomieścić.
Co mogę Ci zaproponować? Po każdym mnożeniu przez kolejną liczbę (bo np. 5! = 1 * 2 * 3 * 4 * 5), zachowuj tylko cyfry jedności i dziesiątek - pozostałe nie będą Ci potrzebne, jeśli chcesz obliczyć tylko cyfry jedności i dziesiątek silni. Przykład:
7! = 5040
Ale załóżmy, że owe 5040 to ogromna wartość, i chcemy policzyć to wspomnianym wcześniej algorytmem.
1 * 2 = 2
2 * 3 = 6
6 * 4 = 24
24 * 5 = 120 // Zachowujemy tylko 20
20 * 6 = 120 // Zachowujemy tylko 20
20 * 7 = 140 // Zachowujemy tylko 40
A więc dwie ostatnie cyfry naszej silni to 40. Możemy teraz łatwo odczytać ostatnią oraz przedostatnią cyfrę.
unsigned result = 40; //Oczywiście tutaj 40 należy zamienić wywołaniem funkcji
unsigned last = result % 10;
unsigned next_to_last = result / 10; // Wykorzystujemy fakt, że przy dzieleniu oba operandy są typu całkowitego - nie musimy rzutować tego "wprost"
Można to też oczywiście zrobić poprzez konwersję na typ std::string, przy pomocy funkcji std::to_string(), a następnie odczytać określone cyfry - jak to zrobić to chyba wiesz.