Potęgowanie liczb
Potęgowanie liczb to jeden z podstawowych algorytmów na jaki możemy trafić podczas matury z informatyki. Małe liczby można potęgować w pamięci, do większych przyda się odpowiedni program lub kalkulator. Potęgowanie w C++ można wykonać za pomocą gotowej funkcji dostępnej w bibliotece math.h lub napisać własną funkcję potęgującą.
Czym jest potęgowanie
Potęgowanie liczb jest to działanie matematyczne, polegające na wielokrotnym mnożeniu liczby przez samą siebie. Liczba, którą będziemy potęgować nazywa się podstawą a górny indeks określający ile razy pomnożymy podstawę przez samą siebie, nazywa się wykładnikiem.
Aby napisać program potęgujący liczby wystarczy stworzyć odpowiednią pętlę, która będzie przemnażać liczbę przez samą siebie określoną ilość razy.
Kod programu w C++
Oto przykładowy kod programu w C++ pozwalający obliczyć dowolną potęgę:
#include <iostream> using namespace std; int main() { int podstawa,wykladnik; int wynik = 1; cout << "Wpisz podstawe: "; cin >> podstawa; cout << "Wpisz wykladnik: "; cin >> wykladnik; for (int i = 0; i<wykladnik; i++) { wynik*=podstawa; } cout << "Wynik to " << wynik << endl; system("PAUSE >NUL"); return 0; }
Na maturze lub sprawdzianie, gdy liczy się czas, można skorzystać z gotowej funkcji zamiast pisać własną. W tym celu niezbędne będzie zaimportowanie biblioteki <math.c>. Potęgowanie odbywa się za pomocą funkcji pow(), tak samo jak pierwiastkowanie. Wynika to z faktu, że potęgowanie jest operacją odwrotną do pierwiastkowania.
#include <iostream> #include <math.h> using namespace std; int main() { int podstawa, wykladnik; cout << "Wpisz podstawe: "; cin >> podstawa; cout << "Wpisz wykladnik: "; cin >> wykladnik; cout << "Wynik to " << pow(podstawa, wykladnik) << endl; system("PAUSE"); return 0; }
Pamiętaj, że podczas egzaminu możesz skorzystać z gotowej biblioteki tylko jeżeli polecenie nie mówi inaczej. Jeżeli będziesz musiał zaimplementować własny algorytm potęgowania, wtedy skorzystania z biblioteki math.h będzie błędem.
Komentarze
Dzięki, moja przygoda z infą dopiero się zaczęła a mam wymagającego nauczyciela ,a ten kod jest mega czytelny i prosty. Jeszcze raz dzięki i pamiętaj że wielu ludzi docenia twoją pracę. Powodzenia!!!
Pytają na blogach, Trybulec DOBRY CHŁOPAK!!
Dobra strona o programowaniu. Ale wracając do potęgowania ten algorytm oczywiście jest dobry ale w pewnym zakresie liczb, związane jest to z pojemnością typu long int więc 2^112 chyba będzie przepełnienie:)))
Pozdrawiam serdecznie.
nie liczy wszystkich potęg np
2^ -112
2^ 112
zaokrągla nie daje dokładnego wyniku przy dodatnich potęgach
A ja mam pytanie. Muszę na studiach napisać kalkulator i jedną z operacji jest pierwiastkowanie. Wpisuję komendę pow(a, (1 / b)) i dla wielu liczb wynik wynosi 1. Nie wiem dlaczego tak się robi, mógłbyś to jakoś wyjaśnić dlaczego nie działa ?
Powinna być long int
Czemu zmienna wynik jest typu int? Nie powinna być typu long int skoro funkcja zwraca long int?
Pragnę się jeszcze przyczepić, gdyż przykład 1. pomimo informacji w tekście „pozwalający obliczyć dowolną potęgę” to nie jest w stanie tego dokonać :). Otóż typ zmiennej int może przechowywać tylko określoną ilość znaków (do liczby 2147483647) i np. potęga 6^100 daje wynik 0. Nawet zastosowanie typu ‚unsigned long long’ nie rozwiąże problemu. Natomiast nie próbowałem drugiego przykładu i ciekaw jestem, czy on sobie z takim równaniem poradzi :). Jeśli to możliwe, to proszę o małą poprawkę w tekście.
To zadanie jest natury algorytmicznej. Nie znajdziesz takiego języka programowania ani systemu, gdzie nie będziesz ograniczony przez pamięć. Zadanie jest bezbłędne, ty natomiast piszesz juz o innym problemie.
@Ola
W przypadku podania ujemnej podstawy a algorytm zachowuje się poprawnie, przedstawia wynik potęgowania dodatni dla wykładnika 2n oraz ujemny dla wykładnika 2n-1.
Podanie ujemnej wartości n to już inny problem dla innego algorytmu.
Co w sytuacji, gdy użytkownik
poda: a<0 i n<0 ?
np. 2^(1/2) = √2
można to wykorzystać bez zmiany tej funkcji, by tak liczyła pierwiastki?
drugi przykład nie chciał przejsc przez kompilację w Visual studio 10. pomogło zmiana deklaracji
float a;
sprawdziłem program, dobrze dziala.
Dobra pomoc naukowa przed trudnym testem pracodawcy.
Kod zawiera błąd
Jeżeli wykładnik jest równy zeru powinien zwrócić 1.
Poprawnie bedzie
{
int wynik=1;
for (int i = 0; i<wykladnik; i++)
wynik*=podstawa;
return wynik;
}
@Tomasz
pewnie dlatego, że nie zainkludowałeś math.h
@auth
#include
#include
sądzę, że jedna z nich może spokojnie sobie wylecieć…
Witam. Korzystam z Visual Studio 2010 i program nie znajduje funkcji pow.. Wiesz może dlaczego?
Nie ma sprawy. A tak ogólnie to fajna stronka, przygotowuje się właśnie do matury z informatyki i jest bardzo pomocna, dzięki;)
Witaj. Dzięki za znalezienie błędu! Artykuł został poprawiony.
Przepraszam, ale ten kod „bez dodatkowych bibliotek” jest chyba błędny. Jak np. podam jako podstawę 2 i wykładnik 3 program zwraca 16 a nie 8 🙁 Co jest z nim nie tak?