Zapis potęgowy definiuje się jako skrócony zapis mnożenia. Jest on bardzo wygodny i pozwala zaoszczędzić bardzo dużo czasu. Jednak potęgowanie można zdefiniować poprzez operację dodawania. W tym artykule zostanie omówiona metoda potęgowania, która nie wymaga znajomości mnożenia, a jedynie potęgowania.
Załóżmy, że należy wyliczyć an, gdzie obie liczb należą do liczb naturalnych. Przypatrzmy się uważnie zapisowi potęgowemu an = a·a·..·a, gdzie po prawej stronie stoi dokładnie n czynników a. Z kolei każde mnożenia można zapisać jako a·a = a+a+..+a, gdzie po prawej stronie stoi a czynników a. Przykładowo jeśli weźmie się 23 = 2·2·2 = (2 + 2)·2 = (2 + 2) + (2 + 2) = 8. Wprowadźmy więc następujący algorytm obliczania potęgi.
Zobaczmy działanie rozpisanego algorytmu dla 34. Na początek utwórzmy listę Czynniki
Czynniki | Operacja |
---|---|
{3, 3, 3, 3} | a1 = 3, a2 = 3, suma = 3 + 3 + 3 = 9 |
{9, 3, 3} | a1 = 9, a2 = 3, suma = 9 + 9 + 9 = 27 |
{27, 3} | a1 = 27, a2 = 3, suma = 27 + 27 + 27 = 81 |
{81} | Zwróć wynik 81 |
Przedstawiona poniżej funkcja potega() oblicza określoną potęge przy założeniu, że a i n to liczby naturalne. W przedstawionym przykładzie pętla dopóki została zamieniona na pętle for, ponieważ z góry wiadomo ile razy trzeba będzie ją wywołać.
W funkcji (2.) wyróżniony został przypadek podnoszenia potęgi do 0. Następnie deklarowane są zmienne (3.) w - do niej będzie zapisywana suma w pełnej iteracji oraz (4.) suma - aktualna wartość pierwszego czynnika. Wykonując (5.) n - 1 pętli składającej się z (6. - 8.) wyliczenia sumy i (9.) przyjęcia jej za nowy, pierwszy czynnik. Na koniec (11.) Wynik znajduje się w zmiennej suma.
Jednak ograniczenie do samych liczb naturalnych nie jest zbyt przyjazne użytkownikowi, ani programiście, dlatego w nowej wersji algorytmu zostanie uwzględnione, że a może należeć do liczb całkowitych. Na początek należy sprawdzić czy liczba a jest ujemna. Jeśli tak to należy usunąć minusa, a potem go ponownie dołożyć jeśli potęga jest nieparzysta.
Nowy kod jest niemalże identyczny do poprzedniego, ale jego funkcjonalność jest zdecydowanie rozszerzona:
Dodane zostały linijki, które (5.) pamiętają czy a było początkowe ujemna oraz (6.) zapewniają, że liczba a jest zawsze dodatnia. Dodatkowo na koniec (14.) jeśli a było początkowo ujemna oraz potęga do której liczba jest podnoszona jest nieparzyste to (15.) dodawany jest minus.
Poniżej został przedstawiony kod funkcji main(), która wczytuje od użytkownika dane i wyświetla wyliczoną potęge. Należy pamiętać, że w przypadku pierwszego kodu a musi być liczbą dodatnią - inaczej program działa niepoprawnie.
Napisz rekurencyjną wersję algorytmu przedstawionego w artykule do wyliczania potęgi bez używania mnożenia. W algorytmie pamiętaj, aby uwzględnić, że a może należeć do liczb całkowitych. Wskazówka: napisz na początek algorytm potęgowania tylko dla a naturalnego.