Potęgowanie liczb

Kategoria: Zadania z programowania

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

Patryk

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!!!

Mateusz

Pytają na blogach, Trybulec DOBRY CHŁOPAK!!

madpl

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.

gienek

nie liczy wszystkich potęg np
2^ -112
2^ 112
zaokrągla nie daje dokładnego wyniku przy dodatnich potęgach

tyrion97

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 ?

Karol

Powinna być long int

Hipcio

Czemu zmienna wynik jest typu int? Nie powinna być typu long int skoro funkcja zwraca long int?

Patryk

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.

Karol

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.

Karol

@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.

Ola

Co w sytuacji, gdy użytkownik
poda: a<0 i n<0 ?

krystian

np. 2^(1/2) = √2
można to wykorzystać bez zmiany tej funkcji, by tak liczyła pierwiastki?

Rafał

drugi przykład nie chciał przejsc przez kompilację w Visual studio 10. pomogło zmiana deklaracji
float a;

Rafał

sprawdziłem program, dobrze dziala.
Dobra pomoc naukowa przed trudnym testem pracodawcy.

Adam Gabryś

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;
}

Arek

@Tomasz
pewnie dlatego, że nie zainkludowałeś math.h

@auth
#include
#include

sądzę, że jedna z nich może spokojnie sobie wylecieć…

Tomasz

Witam. Korzystam z Visual Studio 2010 i program nie znajduje funkcji pow.. Wiesz może dlaczego?

gosc

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;)

Karol

Witaj. Dzięki za znalezienie błędu! Artykuł został poprawiony.

gosc

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?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *