Pierwiastkowanie liczb

Kategoria: Zadania z programowania

Rozwiązując zadania i pisząc programy często potrzebujemy prostej funkcji zwracającej pierwiastek n-tego stopnia z dowolnej liczby. Zadanie możemy rozwiązać gotowymi bibliotekami oraz pisząc własną funkcję. Pierwiastkowanie w C++ jest bardzo proste, może się przydać podczas pisania matury z informatyki.

Pierwiastkowanie w C++

Pierwiastkiem z danej liczby n nazywamy liczbę, która pomnożona przez samą siebie daje liczbę n. Pierwiastkowanie jest odwrotnością potęgowania – z tego powodu w C++ wykonuje się je tą samą funkcją.

Oto kod programu, dzięki któremu wyznaczymy pierwiastek gotową funkcją pow(). Do użycia funkcji niezbędne jest zaimportowanie biblioteki math.h.

#include <iostream>
#include <cstdlib>
#include <math.h>

using namespace std;

int main()
{
    float liczba, stopien;

    cout << "Wprowadz liczbe: ";
    cin >> liczba;
    cout << "Wprowadz stopien pierwiastka: ";
    cin >> stopien;

    cout << pow(liczba, 1/stopien);

    system("PAUSE >nul");

    return 0;
}

Obliczanie pierwiastka za pomocą własnej funkcji jest trudniejsze. Przykładowy program służący do obliczania pierwiastków kwadratowych może posiadać jedną pętle, i sprawdzać czy iloczyn wartości licznika odpowiada liczbie, której szukamy. Oto przykładowa implementacja, jednak umożliwia obliczanie jedynie pierwiastków kwadratowych:

#include <iostream>

using namespace std;

int main()
{
    float liczba, stopien;

    cout << "Wprowadz liczbe: ";
    cin >> liczba;

    for (int i = 0; i<20; i++)
    {
        if (i*i == liczba)
        {
            cout << "Wynik to " << i << endl;
        }
    }

    system("PAUSE >nul");

    return 0;
}

Komentarze

Nusz

Potrzebuję pierwiastkowania całkowitoliczbowego, tzn. n = d^2+c, Wydaje mi się, że odpowiednią jest funkcja, która u mnie pierwiastkuje bezpośrednio z napisu char * n. Ciało wymaga komentarza – dwa znaki łańcucha generują jedną cyfrę pierwiastka, używając systemów niedziesiątkowych. Kwadrat w odpowiednim systemie niedziesiątkowym to
n = 1 0 0 _ d + c. Nieco skompresowałem kod…

long sqrt (char * n, long c ) {
int i = length(n); // potrzebne do stopu i podziału po dwie cyfry
long e, s=0;
if( !(i%2) ) { e = n[s]-‚0’; s++; } // pierwsza cyfra, gdy liczba ma nieparzyście cyfr
else { e = (n[s]-‚0’)*10 + (n[s+1]-‚0’); s+=2; } // liczba ma parzyście cyfr
if( !e ) return 0; // sqrt 0 = 0
c = e-1; // reszta
d = 1; // podstawa
if( s+1==i && 3>c ) return 1; // sqrt 1, 2, 3 to 1 z resztami 0, 1, 2 odpowiednio
while (1) {
if( 2*d<c ) { c = c-d-d-1; d++; continue; } // wzór skróconego mnożenia jako poprawka
if( s+1<i ) { // środek napisu, dołączane następne dwie cyfry
c = 100*c + (n[s]-'0')*10 + (n[s+1]-'0');
d *= 10; // przybliżenie pierwiastka z niedomiarem
s += 2;
} else break; // koniec napisu
}
return d; // pierwiastek kwadratowy z n
};

Adam

Jakiego on podpunktu dotyczy z znanej listy algorytmów? z tych algorytmów z informatora.

Dodaj komentarz

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