Algorytmy

Potęgowanie - implementacja w C++, Javie i Pythonie

Potęgowanie C++

Algorytmy stanowią podstawową część wiedzy wymaganej do matury z informatyki. Na łamach blogu udostępniłem cały szereg algorytmów, które na niej ci się przydadzą. Choć do części z nich dałoby radę dojść samemu, to i tak warto znać schemat ich działania, aby się nie pomylić. Jednym z algorytmów, które każdy powinien być w stanie napisać sam, jest potęgowanie.

kurs matura z informatyki
Już niebawem rusza kurs przygotowujący do matury z informatyki.
Nie daj się zaskoczyć na maturze - zapisz się do listy mailingowej już teraz!

Pojęcie potęgowania powinno być znane każdemu z Was. Potęgę możemy zapisać jako an. Jest to, w uproszczeniu, n-krotne mnożenie liczby a*a. W uproszczeniu, ponieważ dotyczy to n całkowitego dodatniego. Dla n ujemnego potęgę możemy zapisać jako:

 

Jeżeli n będzie ułamkiem w postaci , to wtedy potęgę inaczej możemy zapisać jako:

Przy powyższych wzorach należy pamiętać, że jakakolwiek liczba podniesiona do potęgi 0 daje 1. Jeżeli ktoś poważnie myśli o dobrym wyniku z matury, to nie powinien mieć problemu ze stworzeniem rekurencyjnego algorytmu potęgowania. Niemniej jednak poniżej omówimy sobie, dla przypomnienia, jego schemat i implementacje.

Potęgowanie - algorytm

Na początku pobieramy dwie liczby: podstawę potęgi a i jej wykładnik n. Potęgowanie możemy wykonać na dwa sposoby: iteracyjny i rekurencyjny. W pierwszym sposobie tworzymy zmienną pomocnicza p=1.Potem wykonujemy n iteracji, gdzie w każdej z nich mnożymy p*a. My jednak posłużymy się sposobem rekurencyjnym, gdyż jest bardziej przejrzysty i równie wydajny co iteracyjny. Jeżeli nie wiesz czym jest rekurencja, zajrzyj do tego wpisu. W sposobie rekurencyjnym wykorzystamy zależność, że a^n = (a^(n-1)) * a. Ogółem wzór rekurencyjny możemy zapisać tak:

potęgowanie - wzór

Nasz algorytm będzie wywoływać sam siebie, dzięki czemu otrzyma on wartości poszczególnych potęg o coraz to mniejszych wykładnikach. Będzie on wywoływać się, dopóki nie natrafi na warunek STOP - wykładnik równy 0. Wtedy to wszystkie wyniki wywołań zostaną wymnożone i zwrócone w głównym wywołaniu. Sposób ten możemy też wykorzystać dla wykładników ujemnych. Wystarczy w głównym wywołaniu funkcji zwrócić wartość 1/((a^(-n-2))* a). Powyższy algorytm przedstawiłem na poniższym schemacie blokowym:

 

 

Potęgowanie - implementacje

Skoro mamy już algorytm to, jak na każdy z algorytmów przystało, pora przejść do jego wdrożenia. Przygotowałem dla Was implementacje w trzech, popularnych językach: C++, Javie oraz Pythonie. Jeżeli przygotowujesz się do matury z informatyki, pewnie wiesz, że możesz na niej wybrać jeden z tych języków. Z tego też powodu opisałem każdy kod źródłowy, abyś mógł go lepiej zrozumieć, ale też i zapamiętać.

//program obliczający potęgę danej liczby o wykładniku naturalnym
//Kosiński Łukasz
#include <iostream>

using namespace std;

long double potega(double podstawa, unsigned wykladnik) { if(wykladnik==0)return 1; else return podstawa*potega(podstawa, wykladnik-1);

}

int main() {

double x;
int y;
do
{
cin &gt;&gt; x;
cin &gt;&gt; y;
cout &lt;&lt; potega(x,y) &lt;&lt; endl;	
}while(x!=0);//pętla bedzie się wykonywać dopóki nie wpiszemy zera



system("pause");
return 0;

}

public class Potega {

	public static void main(String[] args) {
		System.out.println("Program liczący potęgi dwóch liczb. (a^n)");
		System.out.println("Podaj podstawę potęgi (a): ");
		Scanner scanner = new Scanner(System.in); // inicjalizacja skanera, który będzie pobierał wartości zmiennych
		int a = scanner.nextInt();
		System.out.println("Podaj wykładnik potęgi (n): ");
		int n = scanner.nextInt();
		scanner.close(); // zwalniamy zasoby
		System.out.println("Liczba " + a + ", podniesiona do potęgi " + n + ", jest równa: " + power(a, n));
	}
	private static float power(int a, int n) { // funkcja rekursywna
		if(n == 0)   // jakakolwiek liczba do zerowej potęgi jest zawsze równa jeden
			return 1;
		if(n < 0) // jeżeli wykładnik potęgi jest ujemny, to tworzymy ułamek 1/(a^(-n))
			return 1/(power(a, -n-1) * a);
		else // w przeciwnym wypadku po prostu liczymy potęgę o wykladniku o jeden mniejszym od n (rekurencja) i mnożymy ją przez a
			return power(a, n-1) * a;
	}

}
def power(a, b): #definiujemy rekurencyjna funkcje
    if b == 0: # jakakolwiek liczba do zerowej potęgi jest zawsze równa jeden
        return 1
    if b < 0: # jeżeli wykładnik potęgi jest ujemny, to tworzymy ułamek 1/(a^(-n))
        return 1/(power(a, -b-1) * a)
    else: # w przeciwnym wypadku po prostu liczymy potęgę o wykladniku o jeden mniejszym od n (rekurencja) i mnożymy ją przez a
        return power(a, b-1) * a

print("Program liczacy potege x^y")
print("Podaj liczbę x: ")
x = int(input())
print("Podaj liczbę y: ")
y = int(input())
print("Potega z tych liczb jest rowna " + str(power(x, y))) #wywolujemy funkcje od razu ja wypisujac

Podsumowanie

Choć potęgowanie jest jednym z najbardziej podstawowych algorytmów, to jest jeszcze masa innych, tych bardziej skomplikowanych. Są one równie przydatne, zarówno na maturze, ale też i w codziennym programowaniu. Jeżeli więc chcesz się lepiej/więcej nauczyć, zajrzyj do tego wpisu. Znajdziesz tu również przydatne informacje na temat innych, ważnych zagadnień dotyczących matury z informatyki. Jeżeli chcesz wyrobić w sobie dobre nawyki w programowaniu, to powinieneś również rzucić okiem na ten tytuł:


grupa wsparcia matura z informatyki