Silnia

Kategoria: Zadania z programowania

Silnia (oznaczana jako n!) jest to iloczyn kolejnych liczb naturalnych od 1 do n. Jest to pojęcie czysto matematyczne, jednak często spotykane w zadaniach informatycznych oraz na maturze. Obliczanie silni można wykonać na wiele sposób. Przy zadaniach z silnią należy zwrócić uwagę na optymalizację. Źle napisany program nie będzie wydajny i będzie miał dużą złożoność czasową.

Kod w C++ (iteracyjny)

W podejściu iteracyjnym tworzymy pętle, która mnoży licznik przez samego siebie tyle razy, ile użytkownik wpisze z klawiatury:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int liczba;
    long long silnia = 1;

    cout << "podaj liczbe" << endl;
    cin >> liczba;

    for (int i = 1; i<=liczba;i++)
    {
        silnia *= i;
    }

    cout << silnia << endl;

    system("PAUSE");
    return(0);
}

Kod w C++ (rekurencyjny)

W podejściu rekurencyjnym potrzebna jest dodatkowa funkcja, która będzie rekurencyjnie wywoływać samą siebie. Z każdym wywołaniem funkcji pomniejszamy argument. Momentem zatrzymania wykonania programu jest sytuacja, gdy przekazany argument jest równy 1.

#include <iostream>
#include <cstdlib>

using namespace std;

int silnia (int liczba)
{
    if (liczba < 2) 
    {
        return liczba;
    }
    return liczba * silnia(liczba - 1);
}

int main()
{
    int liczba;

    cout << "podaj liczbe" << endl;
    cin >> liczba;

    cout << silnia(liczba) << endl;

    system("PAUSE");
    return(0);
}

Komentarze

Dariusz

Rekurencja zawiera drobny błąd. Prosze policzyć silnię z 0.
Z definicji wynika, że silnia z 0 (0! = 1)
tak więc if (liczba<2) return liczba; (raczej return 1)

Czy się mylę?

Wrzem

Świetny artykuł 🙂 Polecam

matiut2

Za pomocą long long możemy uzyskać silnię z mniejszej liczby niż za pomocą unsigned long long co wciąż jest za małe aby obliczyć silnie ze 100 :C. Mój komputer dał radę dojść do silni z 65 (wynik nie był dobry ale jeszcze nie wywalało 0 ), a na pewno można by pobawić się w obliczanie silni ze 100 może jakaś klasa wykorzystująca tablice czy coś

asd sadassd

Silnia 0 == 1
wiec ja bym napisal tak
int sil(int n)
{
return (n <= 0) ? 1 : n * sil(n-1);
//jak poda ujemna to bedzie 1 co nei jest prawda ale ujdzie chyba
}

Marcin

Bardzo świetne artykuły. Świetne do nauki podstaw z programowania w C++ .

Dodaj komentarz

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