Zastanów się jakie mogą być maksymalne dane wejściowe . Dla liczby 2 do potegi Miliard przy założeniu że miliard razy w pętli mnożysz nie zmieści się w czasie . ( zapewne dlatego dostawałeś komunikat o przekroczeniu czasu - zrób u siebie test na duże liczby ) .
Za mały zakres danych - standartowych typach danych można przechowywać liczby z pewnego zakresu , ale nawet największy typ danych nie przechowa 1 miliard do potęgi miliarda ( niektóre języki programowania mają wbudowaną obsługę dużych liczb ) . Na taką liczbe zabrakło by pamięci na serwerze na którym jest uruchomiony .
Liczby zmiennoprzecinkowe jakie używasz w kodzie powyżej są reprezentowane są w szczególny sposób w pamięci komputera . Można za ich pomocą wyrazić bardzo dużą liczbe ale dzieje się to kosztem jej dokładności na miejscach mniej znaczących , Double z zapisaną liczbą 10 do potęgi 300 nie możesz potraktować moduło 10 -- bo taka liczba ma około 15 cyfr ( początkowych ) w zapisie dziesiętnym ( na których się wykonuje operacje ) a informacja z dalszych ( w tym ostatnich ) pozycji rozwinięcia dziesiętnego została utracona .
Zrób na swoim komputerze i sprawdź co zwraca kod
re = pow(a, b);
re = fmod(re,10);
cout << re << endl;
dla coraz większych liczb: a ^ b
2^ 10
2^ 11
2^ 12
....
2^100
2^101
.....
2^200
2^201
( Edytor frumo coś szaleje - nie pozwala mi wyliczać punktów - i odlicza znowu od 1 a powinno być 4 )
Zastanów się jak szybko potęgować . Np : czy 5 do potęgi 32 trzeba 32 razy mnożyć aby otrzymać prawidłowy wynik .
Operacje moduło ( arytmetyka moduło ) też charakteryzuje pewna powtarzalność .
Nie możesz zrobić tego zadania bo zapewne nie wiesz o dwóch sztuczkach jakie trzeba znać i umiejętnie zastosować .